onebot icon indicating copy to clipboard operation
onebot copied to clipboard

支持使用 URL query 参数传递鉴权 token

Open stdrc opened this issue 3 years ago • 3 comments

摘要

Authorization 头之外,允许通过 /?access_token=xxx 来传递 access_token

动机

部分场景下,应用端或 OneBot 实现无法操作 HTTP 请求头,例如:

  • 浏览器和 Deno 发起 WebSocket 连接时
  • IFTTT Maker Webhooks

具体描述

通信方式 - HTTP、正向 WebSocket

“鉴权”部分,实现应优先检查 Authorization 头,如果存在,则依照原来的标准鉴权,如果不存在,则尝试获取 access_token URL query 参数,以此鉴权。

通信方式 - HTTP Webhook

“请求头”部分,若无法操作请求头,实现可以通过 access_token URL query 参数来传递 token,应用端应优先检查 Authorization 头,如果存在,则依照原来的标准鉴权,如果不存在,则尝试获取 access_token URL query 参数,以此鉴权。

反向 WebSocket 文档会指向此处,故不用修改。

局限

无。

替代方案

无。

stdrc avatar Jun 10 '22 15:06 stdrc

目前一个问题是如果 OneBot 实现端跑在 Deno 或浏览器中,发起反向 WS 连接也无法设置 header,所以需要允许实现端也可以通过 access_token 传递 token。

另外还有 X-OneBot-Version X-Impl X-Platform X-Self-ID 几个 header,可以使用 WebSocket 的 Sec-WebSocket-Protocol 头来传递,也就是 #164 的建议。

stdrc avatar Jun 15 '22 11:06 stdrc

是不是关于请求头解析替代应该规定一个转换表和优先级?下面是我的假想方案,只作为补充。

方案一,使用 GET 传参

使用 GET 参数传参

对于部分不支持自定义 Header 的 OneBot 实现或逻辑端中,可以使用 GET 参数来替代 Header 字段的内容,但无论对于哪一方而言,都必须对两者支持解析。

Header 参数名 GET 参数名 说明
Authorization access_token Authorization 头以 Bearer 开头,转换为 GET 传参只需传入后面的 token 字段
X-OneBot-Version onebot_version
X-Impl impl
X-Platform platform
X-Self-ID self_id

传入优先级

当 GET 参数和 Header 参数同时传入时,实现和逻辑端应以 GET 参数优先。

方案二,采用 Sec-WebSocket-Protocol

使用合并 Header 传入

对于部分不支持自定义 Header 的 OneBot 实现或逻辑端,例如浏览器(以目前的 Chrome 102 为准)仅支持自定义一种 Header:Sec-WebSocket-Protocol,可以采用该 Header 进行传递和声明,具体规定如下:

  • 该头传入的内容为 JSON,为 k-v 类型,key 对应要传入的头名称,例如 X-OneBot-Version
  • 对 JSON 对象采用 Base64 处理,传入该 Header
  • 如果原 Header 与该 Header 均存在时,该 Header 将被忽略。但当必需的 Header 缺失时,如果该 Header 可解析 Base64 和 JSON,则从解析后的 JSON 对象中取出

crazywhalecc avatar Aug 04 '22 04:08 crazywhalecc

RFC 内容已更新,同时提了 #204,两者共同解决不能操作 WebSocket 请求头的问题

stdrc avatar Aug 08 '22 16:08 stdrc