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