OAuth2 访问令牌中允许使用哪些字符?

bjm*_*jmc 9 specifications character special-characters access-token oauth-2.0

RFC6749RFC6750似乎彼此不同意 OAuth2 访问令牌中允许使用哪些字符。

RFC6749(原始 OAuth2 规范)的A.12 节定义了访问令牌格式如下:

A.12. “access_token”语法

“access_token”元素在第 4.2.2 和 5.1 节中定义:

access-token = 1*VSCHAR 
Run Code Online (Sandbox Code Playgroud)

ABNF 格式中,VSCHAR 表示:

VSCHAR = %x20-7E

(这基本上是所有可打印的 ASCII 字符

但是,在 RFC6750(处理 OAuth2 不记名令牌的使用)中,第 2.1 节似乎为访问令牌设置了更严格的允许字符子集。

承载凭证的语法如下:

b64token    = 1*( ALPHA / DIGIT /
                   "-" / "." / "_" / "~" / "+" / "/" ) *"="
credentials = "Bearer" 1*SP b64token
Run Code Online (Sandbox Code Playgroud)

所以这是一组限制性更强的字符,仅包括字母数字、六个特殊字符和=用于填充的尾随。

我的问题是:

1) 控制这些文件中的哪一个?RFC6750 是否优先因为它更具限制性?

2)就“野外”的实际实现而言,访问令牌是否总是仅限于 RFC6750 字符集?

3) 额外问题:有谁知道为什么在同月发布的关于如此密切相关主题的这两个规范在访问令牌格式上存在分歧?

Sør*_*org 8

TL;DR:标准之间没有冲突。OAuth 访问令牌通常可以包含任何可打印的 ASCII 字符,但如果访问令牌是不记名令牌,则它必须使用“token64”语法以符合 HTTP/1.1。

RFC 6749, §1.4告诉我们:“访问令牌是一个字符串”并且“通常对客户端不透明”。§A.12将其定义为一个或多个可打印的 ASCII 字符([ -~]+在正则表达式中)。

RFC 6749 定义了获取访问令牌的各种方法,但并不关心如何实际使用访问令牌,只是说您将它“呈现”给资源服务器,资源服务器必须验证然后接受或拒绝它。

但是 RFC 6749 确实要求授权服务器告诉客户端令牌类型(另一个字符串),客户端可以使用它来确定如何使用访问令牌。

一个令牌类型的字符串或者是一个IANA注册类型名称(如Bearermac),或供应商URL(像http://oauth.example.org/v1),虽然URL仅仅是一个方便的命名空间标识符,并且不必决心东西。

在大多数部署中,令牌类型将为Bearer,其语义在 RFC 6750 中定义。

RFC 6750 定义了向资源服务器呈现承载访问令牌的三种方法 (§§2.1–2.3)。该推荐的方法(其资源服务器必须支持是符合标准)是在HTTP授权头(发送§2.1),在这种情况下,令牌必须是一个“b64token”([-a-zA-Z0-9._~+/]+=*在正则表达式的术语)。

这与 HTTP/1.1 规范所称的“token68”(RFC 7235 §2.1)相匹配,并且对于允许在 HTTP 授权标头中不加引号地使用令牌是必要的。(至于为什么 HTTP/1.1 允许这些确切的字符,这归结为与 HTTP/1.0 和基本身份验证标准相关的历史原因,以及当前和历史 HTTP 实现的限制。网络协议是一项混乱的业务。)

“b64token”(又名“token68”)允许通常与 base64 编码一起使用的 ASCII 字符子集,但(尽管名称如此)记名令牌不强加任何 base64 语义。它只是客户端从一台服务器接收并传递给另一台服务器的不透明字符串。实现可能会为其分配语义(例如JWT),但这超出了 OAuth 或 Bearer 令牌标准。

RFC 6750 没有规定如果与其他两种(不推荐的)方法一起使用,Bearer 访问令牌必须是 b64token,但考虑到客户端应该能够选择该方法,给出它是一个非 b64token 令牌。

其他 OAuth 令牌类型可能不依赖于在 HTTP 标头中不加引号地传递(或者它们可能根本不使用 HTTP),因此可以自由使用任何可打印的 ASCII 字符。这可能是例如令牌类型是有用的不是不透明的客户端; 例如,我目前正在处理一个设置,其中访问令牌响应看起来有点像这样:

{
  "access_token": "{\"endpoint\": \"srv8.example.org\", \"session_id\": \"fafc2fd\"}",
  "token_type": "http://vendor.example.org/",
  "expires_in": 3600,
  "refresh_token": "tGzv3JOkF0XG5Qx2TlKWIA"
}
Run Code Online (Sandbox Code Playgroud)

在这里,访问令牌是一个 JSON 编码的数据结构,客户端必须根据它(根据与供应商令牌类型关联的规则)来访问受保护的资源。