WWW-Authenticate realm 参数应该被编码吗?

Should the WWW-Authenticate realm parameter be encoded?

在为 OAuth/OAuth1a 构建 WWW-Authenticate header 值时,它需要 percent-encoding 参数。规范和实现对于 realm 参数是否应为 percent-encoded 不明确。

规范的 5.4.1. Authorization Header 部分内容如下:

The OAuth Protocol Parameters are sent in the Authorization header the following way:

  1. Parameter names and values are encoded per Parameter Encoding.
  2. For each parameter, the name is immediately followed by an '=' character (ASCII code 61), a '"' character (ASCII code 34), the parameter value (MAY be empty), and another '"' character (ASCII code 34).
  3. Parameters are separated by a comma character (ASCII code 44) and OPTIONAL linear whitespace per [RFC2617].
  4. The OPTIONAL realm parameter is added and interpreted per [RFC2617], section 1.2.

For example:

            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 中。但是,WWW-Authenticate header 示例中的 OAuth1a 规范将领域显示为 realm="http://sp.example.com/",这不是 percent-encoding 冒号或斜杠。

更令人困惑的是,这似乎因实施而异。许多 OAuth 实现没有对参数进行特殊处理,只是 percent-encode 所有参数,但其他 OAuth 实现对 realm 参数进行特殊处理,并将其从 percent-encoding.[=21= 中排除]

realm 参数添加到 WWW-Authenticate header 的正确行为是什么?

WWW-Authenticate header 和 realm 参数,特别是由 rfc2617 and rfc7235, which do not say anything about encoding. rfc7235 定义的示例,其中 "Login to \"apps\"" 中的空格不是percent-encoded.

OAuth1a 规范的

rfc2617 and rfc7235 are the authority on the WWW-Authenticate header and realm parameter while the OAuth1a spec is only the authority on the additional OAuth specific parameters. Therefore the realm parameter should not be percent-encoded and section 5.4.1 应该被解释为仅谈论 OAuth 协议参数 关于 percent-encoding.