Skip to main content

1. Access Authentication (访问认证)

1.1 Reliance on the HTTP/1.1 Specification (依赖HTTP/1.1规范)

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

1.2 Access Authentication Framework (访问认证框架)

HTTP提供了一种简单的挑战-响应认证机制 (Challenge-Response Authentication Mechanism),服务器可以 (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(abs_path为空的服务器的absoluteURI;参见 [2] 的第5.1.2节)结合,定义了保护空间 (Protection Space)。这些领域允许将服务器上的受保护资源划分为一组保护空间,每个空间都有自己的认证方案和/或授权数据库。realm值是一个字符串,通常由源服务器分配,可能具有特定于认证方案的附加语义。请注意,可能存在具有相同auth-scheme但不同realm的多个挑战。

希望向源服务器进行身份验证的用户代理——通常但不一定在收到401 (Unauthorized) 后——可以 (MAY) 通过在请求中包含Authorization头字段来进行身份验证。希望向代理进行身份验证的客户端——通常但不一定在收到407 (Proxy Authentication Required) 后——可以 (MAY) 通过在请求中包含Proxy-Authorization头字段来进行身份验证。Authorization字段值和Proxy-Authorization字段值都由凭据 (Credentials) 组成,其中包含客户端对所请求资源领域的认证信息。用户代理必须 (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节)。