Skip to content

History

Showing with 24 additions and 17 deletions.
  1. +24 −17 启动器技术规范.md
41 changes: 24 additions & 17 deletions 启动器技术规范.md
Original file line number Diff line number Diff line change
Expand Up @@ -49,29 +49,36 @@
启动器可以将 API 地址直接存储于配置文件中,让用户通过修改配置文件的方式设置验证服务器。这种配置方式实现简单,如果你的启动器只用作服务器专用启动器,则可以使用这种配置方式。

### 在启动器中输入地址
在这种配置方式下,用户通过在启动器中输入 URL 来完成验证服务器的设置。这里的 URL 可能是完整的 API 地址,也可能是缩略的(如 `example.com`)。启动器需要通过以下步骤将其解析为真正的 API 地址:
在这种配置方式下,用户通过在启动器中输入 URL 来完成验证服务器的设置。这里的 URL 可能是完整的 API 地址(如 `https://example.com/api/yggdrasil/`),也可能是缩略的地址(如 `example.com`)。

#### 补全协议
> 相关提案:[[proposal] 地址协议补全 #17](https://github.com/yushijinhun/authlib-injector/issues/17)
当 URL 未标明协议(HTTPS 或 HTTP)时,我们约定将其自动补全为 **HTTPS** 协议。亦即,`example.com/api/yggdrasil/` 应当被理解为 `https://example.com/api/yggdrasil/`

如果用户输入的地址省略了协议,则启动器应将其用 HTTPS 协议补充完整。例如,`example.com` 应被补全为 `https://example.com`
> 出于安全考虑,启动器即使无法通过 HTTPS 协议连接,也**不得**降级到明文的 HTTP 协议
当协议补全发生时,启动器应通过某种方式告知用户,地址将被补全为 HTTPS 协议而非 HTTP 协议,以避免造成困惑
同时,authlib-injector 规定了一种服务发现机制,称为 API 地址指示(ALI)。它用于将用户输入的缩略的、不完整的地址,转换为完整的 API 地址

为防止降级攻击,即使无法通过 HTTPS 协议连接,启动器也**不得**使用明文的 HTTP 协议重新连接。
#### 处理 API 地址指示(ALI)
为了将用户输入的地址解析为真正的 API 地址,启动器需要进行如下操作:
1. 如果 URL 缺少协议,则将其补全为 HTTPS 协议。
2. 向 URL 发送 GET 请求(跟随 HTTP 重定向)。
3. 如果响应包含 ALI 头(HTTP 头部 `X-Authlib-Injector-API-Location`),那么 ALI 指向的 URL 就是 API 地址。
* `X-Authlib-Injector-API-Location` 可以是绝对 URL,亦可以是相对 URL。
* 如果 ALI 指向其自身,那就意味着当前 URL 就是 API 地址。
4. 如果响应不包含 ALI 头部,则默认认为当前 URL 是 API 地址。

伪代码:
```
function resolve_api_url(url)
response = http_get(url) // follow redirects
#### 处理 API 地址指示
> 相关提案:[[proposal] API 地址指示(ALI) #18](https://github.com/yushijinhun/authlib-injector/issues/18)
if response.headers["x-authlib-injector-api-location"] exists
new_url = to_absolute_url(response.headers["x-authlib-injector-api-location"])
if new_url != url
return new_url
为了将用户输入的地址解析为真正的 API 地址,启动器需要进行如下操作:
1. 将补全协议后的地址作为**当前地址**
2.**当前地址**发送 GET 请求。
3. 如果响应中不包含 ALI 头(`X-Authlib-Injector-API-Location`),则**当前地址**即为 API 地址。流程结束。
4. 从 ALI 头中解析出 **ALI 所指地址**
* 若 ALI 头中为相对 URL,则需将其转换为绝对 URL。
5. 若去除 URL 末尾的斜杠 `/`**当前地址****ALI 所指地址**相同,则**当前地址**即为 API 地址。流程结束。
6.**ALI 所指地址**作为**当前地址**,回到步骤 2,并记其为一次重定向。
* 当重定向次数大于最大允许次数(一般为 5 次)时,触发异常。
// if you are going to fetch the metadata next, 'response' can be reused
return url
```

### 通过拖拽设置
此方式允许用户通过[鼠标拖拽 (DnD)](https://developer.mozilla.org/en-US/docs/Web/API/HTML_Drag_and_Drop_API)来设置验证服务器。
Expand Down