在为 OAuth/ OAuth1a构建 WWW-Authenticate 标头值时,它要求对参数进行百分比编码。规范和实现对于realm
参数是否应该进行百分比编码是模棱两可的。
OAuth 协议参数通过以下方式在授权标头中发送:
- 参数名称和值按照参数编码进行编码。
- 对于每个参数,名称后面紧跟一个 '=' 字符(ASCII 码 61)、一个 '"' 字符(ASCII 码 34)、参数值(可以为空)和另一个 '"' 字符(ASCII 码34)。
- 根据 [RFC2617],参数由逗号字符(ASCII 代码 44)和可选线性空格分隔。
- 根据 [RFC2617] 第 1.2 节添加和解释 OPTIONAL 领域参数。
例如:
Authorization: OAuth realm="http://sp.example.com/", oauth_consumer_key="0685bd9184jfhq22", oauth_token="ad180jjd733klru7", oauth_signature_method="HMAC-SHA1", oauth_signature="wOJIO9A2W5mFwDgiDvZbTSMK%2FPY%3D", oauth_timestamp="137131200", oauth_nonce="4572616e48616d6d65724c61686176", oauth_version="1.0"
如果这些步骤是按顺序执行的,那么似乎只有 OAuth 特定参数是要进行 url 编码的。
如果不打算按顺序执行这些步骤,则该realm
参数可能包含在步骤 1 中。但是,OAuth1a规范中的 WWW-Authenticate 标头示例显示了realm="http://sp.example.com/"
不是对冒号或斜杠进行百分比编码的领域。
更令人困惑的是,这似乎因实施而异。许多 OAuth 实现对参数没有特殊处理,只是对所有参数进行百分比编码,但其他 OAuth 实现对realm
参数进行特殊处理并将其从百分比编码中排除。
realm
将参数添加到 WWW-Authenticate 标头的正确行为是什么?