跳到主要内容

4. 头部字段定义 (Header Field Definitions)

本节定义与 HTTP 认证框架相关的头部字段的语法与语义.

4.1 WWW-Authenticate​

"WWW-Authenticate" 头部字段指出适用于目标资源的认证方案与参数.

WWW-Authenticate = 1#challenge

生成 401 (Unauthorized) 响应的服务器必须 (MUST) 发送一个含至少一个质询的 WWW-Authenticate 头部字段. 服务器可以在其他响应消息中生成 WWW-Authenticate 头部字段 (MAY), 以表明提供凭证 (或不同凭证) 可能影响响应.

转发响应的代理禁止 (MUST NOT) 修改该响应中的任何 WWW-Authenticate 字段.

建议用户代理在解析字段值时特别小心, 因为它可能包含不止一个质询, 且每个质询可以包含一个以逗号分隔的认证参数列表. 此外, 该头部字段本身可以出现多次.

例如:

WWW-Authenticate: Newauth realm="apps", type=1,
title="Login to \"apps\"", Basic realm="simple"

这个头部字段包含两个质询: 一个属于 "Newauth" 方案, realm 值为 "apps", 带有两个附加参数 "type" 与 "title"; 另一个属于 "Basic" 方案, realm 值为 "simple".

注意: 质询文法产生式同样使用列表语法. 因此, 一串 "逗号, 空白, 逗号" 既可以被看作作用于前一个质询, 也可以被看作质询列表中的一个空条目. 实践中, 这种歧义不影响头部字段值的语义, 因而无害.

4.2 Authorization​

"Authorization" 头部字段允许用户代理向源服务器认证自己 -- 通常但未必是在收到 401 (Unauthorized) 响应之后. 其值由凭证组成, 内含用户代理针对所请求资源 realm 的认证信息.

Authorization = credentials

如果请求已通过认证且指定了 realm, 则假定相同凭证对该 realm 内的所有其他请求都有效 (假定认证方案本身不要求其他行为, 例如凭证随质询值变化, 或使用同步时钟).

转发请求的代理禁止 (MUST NOT) 修改该请求中的任何 Authorization 字段. 关于 HTTP 缓存处理 Authorization 字段的细节与要求, 见 [RFC7234] 第 3.2 节.

4.3 Proxy-Authenticate​

"Proxy-Authenticate" 头部字段由至少一个质询组成, 指出适用于该代理针对此有效请求 URI ([RFC7230] 第 5.5 节) 的认证方案与参数. 代理在它生成的每个 407 (Proxy Authentication Required) 响应中必须发送 (MUST) 至少一个 Proxy-Authenticate 头部字段.

Proxy-Authenticate = 1#challenge

与 WWW-Authenticate 不同, Proxy-Authenticate 头部字段只适用于响应链上的下一个出站客户端. 这是因为只有选择了给定代理的那个客户端才可能拥有认证所需的凭证. 然而, 当多个代理位于同一管理域内时, 例如大型企业网络中的办公与区域缓存代理, 凭证通常由用户代理生成并沿层级传递直至被消费. 因此, 在这种配置下, 看起来就像是 Proxy-Authenticate 在被转发, 因为每个代理都会发送相同的质询集合.

注意, WWW-Authenticate 的解析考量同样适用于该头部字段; 细节见第 4.1 节.

4.4 Proxy-Authorization​

"Proxy-Authorization" 头部字段允许客户端向要求认证的代理标识自己 (或其用户). 其值由凭证组成, 内含客户端针对所请求资源的代理和/或 realm 的认证信息.

Proxy-Authorization = credentials

与 Authorization 不同, Proxy-Authorization 头部字段只适用于请求链上使用 Proxy-Authenticate 字段要求认证的下一个入站代理. 当链上使用多个代理时, Proxy-Authorization 头部字段被第一个期待收到凭证的入站代理消费. 如果代理之间靠这种机制协同认证某个请求, 代理可以把客户端请求中的凭证中继给下一个代理 (MAY).