跳到主要内容

1. 访问认证 (Access Authentication)

1.1 对 HTTP/1.1 规范的依赖

本规范是 HTTP/1.1 规范 [2] 的配套文档.它使用了该文档第 2.1 节中的增强型 BNF, 并依赖该文档中定义的非终结符以及 HTTP/1.1 规范的其他方面.

1.2 访问认证框架

HTTP 提供了一种简单的挑战-响应认证机制 (challenge-response authentication mechanism).服务器 MAY 使用它来质询客户端请求, 客户端 MAY 使用它来提供认证信息.该机制使用一个可扩展、大小写不敏感的令牌 (token) 来标识认证方案 (authentication scheme), 后面跟着一个以逗号分隔的属性-值对列表, 其中携带通过该方案完成认证所需的参数.

auth-scheme    = token
auth-param = token "=" ( token | quoted-string )

源服务器 (origin server) 使用 401 (Unauthorized) 响应消息来质询用户代理的授权.该响应 MUST 包含一个 WWW-Authenticate 首部字段, 其中至少含有一个适用于被请求资源的挑战.代理 (proxy) 使用 407 (Proxy Authentication Required) 响应消息来质询客户端的授权, 并且 MUST 包含一个 Proxy-Authenticate 首部字段, 其中至少含有一个适用于被请求资源的挑战.

challenge   = auth-scheme 1*SP 1#auth-param

注意: 如果 WWW-AuthenticateProxy-Authenticate 首部字段的值中包含多个挑战, 或者提供了多个 WWW-Authenticate 首部字段, 用户代理在解析时必须特别小心, 因为挑战本身的内容可能包含以逗号分隔的认证参数列表.

认证参数 realm 为所有认证方案定义如下:

realm       = "realm" "=" realm-value
realm-value = quoted-string

对于所有发出挑战的认证方案, realm 指令 (大小写不敏感) 都是 REQUIRED 的.realm 的值 (大小写敏感) 与所访问服务器的规范根 URL 一起定义了保护空间 (protection space).这里的规范根 URL 指 abs_path 为空时该服务器对应的 absoluteURI; 参见 [2] 的第 5.1.2 节.通过这些 realm, 可以将服务器上的受保护资源划分为一组保护空间, 每个保护空间都拥有自己的认证方案和/或授权数据库.realm 值是一个字符串, 一般由源服务器分配, 并且可能具有该认证方案特有的附加语义.请注意, 可能存在多个使用相同 auth-schemerealm 不同的挑战.

希望向源服务器证明自身身份的用户代理, 通常但并不一定是在收到 401 (Unauthorized) 之后, MAY 通过在请求中包含 Authorization 首部字段来完成.希望向代理证明自身身份的客户端, 通常但并不一定是在收到 407 (Proxy Authentication Required) 之后, MAY 通过在请求中包含 Proxy-Authorization 首部字段来完成.AuthorizationProxy-Authorization 的字段值都由凭据 (credentials) 构成, 其中包含客户端针对所请求资源所属 realm 的认证信息.用户代理 MUST 选择其所理解的最强 auth-scheme 对应的挑战, 并据此向用户请求凭据.

credentials = auth-scheme #auth-param

注意: 许多浏览器只识别 Basic 认证, 并要求它是首先呈现的 auth-scheme.只有当 Basic 认证是可接受的最低标准时, 服务器才应包含它.

保护空间决定了凭据可以被自动应用的范围.如果先前某个请求已经完成授权, 那么在由认证方案、参数和/或用户偏好决定的一段时间内, 相同凭据 MAY 被复用于该保护空间内的所有其他请求.除非认证方案另有定义, 单个保护空间不能超出其所在服务器.

如果源服务器不希望接受请求中发送的凭据, 它 SHOULD 返回 401 (Unauthorized) 响应.该响应 MUST 包含一个 WWW-Authenticate 首部字段, 其中至少包含一个适用于被请求资源的挑战, 该挑战可能是新的.若代理不接受请求中发送的凭据, 它 SHOULD 返回 407 (Proxy Authentication Required).该响应 MUST 包含一个 Proxy-Authenticate 首部字段, 其中包含一个适用于被请求资源的挑战, 该挑战也可能是新的.

HTTP 协议并未将应用限制在这种简单的挑战-响应访问认证机制上.还 MAY 使用其他机制, 例如传输层加密、通过消息封装实现认证, 或增加额外首部字段来指定认证信息.不过, 这些附加机制并未在本规范中定义.

对于用户代理与源服务器之间的认证, 代理 MUST 保持完全透明.也就是说, 它们必须原样转发 WWW-AuthenticateAuthorization 首部, 并遵循 [2] 第 14.8 节中的规则.Proxy-AuthenticateProxy-Authorization 首部字段都属于逐跳首部 (hop-by-hop headers), 参见 [2] 第 13.5.1 节.