跳到主要内容

2. 访问认证框架 (Access Authentication Framework)

2.1 质询与响应 (Challenge and Response)​

HTTP 提供一个简单的质询-响应认证框架: 服务器可以用它质询客户端请求, 客户端可以用它提供认证信息. 它使用一个大小写不敏感的令牌 (token) 来标识认证方案 (auth-scheme), 后跟经由该方案实现认证所需的附加信息. 后者既可以是一个以逗号分隔的参数列表, 也可以是能够容纳 base64 编码信息的单一字符序列.

认证参数是 name=value 对, 其中名称令牌按大小写不敏感匹配, 且每个参数名在每个质询中必须 (MUST) 只出现一次.

auth-scheme = token

auth-param = token BWS "=" BWS ( token / quoted-string )

token68 = 1*( ALPHA / DIGIT /
"-" / "." / "_" / "~" / "+" / "/" ) *"="

token68 语法允许 66 个 URI 未保留字符 ([RFC3986]) 外加少数几个其他字符, 因此它可以承载 base64, base64url (URL 与文件名安全字母表), base32 或 base16 (十六进制) 编码, 带或不带填充, 但不含空白字符 ([RFC4648]).

源服务器使用 401 (Unauthorized) 响应消息来质询用户代理的授权, 其中包含一个 WWW-Authenticate 头部字段, 内含至少一个适用于所请求资源的质询.

代理使用 407 (Proxy Authentication Required) 响应消息来质询客户端的授权, 其中包含一个 Proxy-Authenticate 头部字段, 内含至少一个该代理针对所请求资源的质询.

challenge = auth-scheme [ 1*SP ( token68 / #auth-param ) ]

注意: 许多客户端无法解析包含未知方案的质询. 这一问题的一种变通方法是把受良好支持的方案 (如 "basic") 列在前面.

希望向源服务器认证自己的用户代理 -- 通常但未必是在收到 401 (Unauthorized) 之后 -- 可以通过在请求中包含一个 Authorization 头部字段来做到.

希望向代理认证自己的客户端 -- 通常但未必是在收到 407 (Proxy Authentication Required) 之后 -- 可以通过在请求中包含一个 Proxy-Authorization 头部字段来做到.

Authorization 字段值与 Proxy-Authorization 字段值都包含客户端针对所请求资源 realm 的凭证, 其依据是在某个响应中 (可能在过去的某个时刻) 收到的质询. 在构造其值时, 用户代理应当选择它认为自己所理解的最安全的认证方案的质询, 并酌情从用户处获取凭证. 在头部字段值中传输凭证意味着关于底层连接保密性的重大安全考虑, 如第 6.1 节所述.

credentials = auth-scheme [ 1*SP ( token68 / #auth-param ) ]

在收到一个针对受保护资源且省略凭证, 含有无效凭证 (例如错误口令) 或部分凭证 (例如认证方案需要多于一轮往返) 的请求时, 源服务器应当 (SHOULD) 发送一个 401 (Unauthorized) 响应, 其中包含一个 WWW-Authenticate 头部字段, 内含至少一个适用于所请求资源的 (可能是新的) 质询.

同样, 在收到省略代理凭证或含有无效或部分代理凭证的请求时, 要求认证的代理应当 (SHOULD) 生成一个 407 (Proxy Authentication Required) 响应, 其中包含一个 Proxy-Authenticate 头部字段, 内含至少一个适用于该代理的 (可能是新的) 质询.

收到有效但不足以获得访问的凭证的服务器, 应当以 403 (Forbidden) 状态码响应 ([RFC7231] 第 6.5.3 节).

HTTP 不把应用限制在这套简单的质询-响应访问认证框架之内. 可以使用额外的机制, 例如传输层认证或经由消息封装的认证, 并可配合指定认证信息的额外头部字段. 不过, 本规范不定义此类额外机制.

2.2 保护空间 (Protection Space, Realm)​

"realm" 认证参数保留给那些希望指示保护范围的认证方案使用.

保护空间由被访问服务器的规范根 URI (即有效请求 URI 的 scheme 与 authority 组件; 见 [RFC7230] 第 5.5 节), 结合 realm 值 (如果存在) 共同定义. 这些 realm 允许把服务器上的受保护资源划分为一组保护空间, 每个空间拥有自己的认证方案和/或授权数据库. realm 值是一个字符串, 一般由源服务器分配, 可以带有特定于认证方案的附加语义. 注意, 一个响应可以带有多个认证方案相同但 realm 不同的质询.

保护空间决定了凭证可以被自动应用的范围. 如果先前的请求已被授权, 用户代理可以 (MAY) 在由认证方案, 参数和/或用户偏好 (例如可配置的不活动超时) 决定的一段时间内, 对该保护空间内的所有其他请求重用相同的凭证. 除非认证方案明确允许, 单个保护空间不能超出其服务器的范围.

出于历史原因, 发送方必须 (MUST) 只生成带引号字符串 (quoted-string) 语法. 为与长期同时接受两种记法的既有客户端保持最大互操作性, 接收方可能不得不同时支持 token 与 quoted-string 两种语法.