WWW-Authenticate 头

Baseline 广泛可用 *

此特性已相当成熟,可在许多设备和浏览器版本上使用。自 ⁨2015 年 7 月⁩以来,各浏览器均已提供此特性。

* 此特性的某些部分可能存在不同级别的支持。

HTTP WWW-Authenticate 响应头用于通告可能用于访问特定资源的 HTTP 认证方法(或 质询)。

此头部是通用 HTTP 认证框架的一部分,可与多种认证方案一起使用。每个质询都标识了服务器支持的方案以及为该方案类型定义的附加参数。

使用 HTTP 认证的服务器将以 401 Unauthorized 响应受保护资源的请求。此响应必须包含至少一个 WWW-Authenticate 头和至少一个质询,以指示可以使用哪些认证方案来访问资源以及每个特定方案所需的任何附加数据。

一个 WWW-Authenticate 头中允许有多个质询,一个响应中允许有多个 WWW-Authenticate 头。服务器还可以在其他响应消息中包含 WWW-Authenticate 头,以指示提供凭据可能会影响响应。

收到 WWW-Authenticate 头后,客户端通常会提示用户输入凭据,然后重新请求资源。这个新请求使用 Authorization 头,以适合所选认证方法的编码方式向服务器提供凭据。客户端应选择其理解的最安全的质询(请注意,在某些情况下,“最安全”的方法是有争议的)。

头类型 响应头
禁止请求头

语法

http
WWW-Authenticate: <challenge>

其中 <challenge><auth-scheme> 组成,后跟可选的 <token68> 或逗号分隔的 <auth-params> 列表。

challenge = <auth-scheme> <auth-param>, …, <auth-paramN>
challenge = <auth-scheme> <token68>

例如

http
WWW-Authenticate: <auth-scheme>
WWW-Authenticate: <auth-scheme> token68
WWW-Authenticate: <auth-scheme> auth-param1=param-token1
WWW-Authenticate: <auth-scheme> auth-param1=param-token1, …, auth-paramN=param-tokenN

token68 或认证参数的存在取决于所选的 <auth-scheme>。例如,基本认证需要一个 <realm>,并允许可选使用 charset 键,但不支持 token68

http
WWW-Authenticate: Basic realm="Dev", charset="UTF-8"

多个质询可以通过逗号分隔列表发送

http
WWW-Authenticate: <challenge>, …, <challengeN>

单个响应中也可以发送多个头

http
WWW-Authenticate: <challenge>
WWW-Authenticate: <challengeN>

指令

<auth-scheme>

一个不区分大小写的令牌,指示所使用的认证方案。一些常见的类型是 BasicDigestNegotiateAWS4-HMAC-SHA256。IANA 维护着一个认证方案列表,但主机服务也提供其他方案。

<auth-param> 可选

一个认证参数,其格式取决于 <auth-scheme><realm> 在下面描述,因为它在许多认证方案中是一个常见的认证参数。

<realm> 可选

字符串 realm 后跟 = 和一个描述受保护区域的带引号字符串,例如 realm="staging environment"。域允许服务器划分其受保护的区域(如果由允许此类划分的方案支持)。有些客户端会向用户显示此值,以告知他们需要哪些特定凭据——尽管大多数浏览器已停止这样做以应对网络钓鱼。此值唯一可靠支持的字符集是 us-ascii。如果未指定域,客户端通常会显示格式化的主机名。

<token68> 可选

一个令牌,可能对某些方案有用。该令牌允许 66 个未保留的 URI 字符以及其他一些字符。它可以包含 base64、base64url、base32 或 base16(十六进制)编码,带或不带填充,但排除空格。auth-param 列表的 token68 替代方案是为了与传统认证方案保持一致而支持的。

通常,你需要查看相关规范以获取每个 <auth-scheme> 所需的认证参数。以下部分描述了一些常见认证方案的令牌和认证参数。

基本认证指令

<realm>

上所述<realm>。请注意,对于 Basic 认证,域是强制性的。

charset="UTF-8" 可选

告知客户端服务器在提交用户名和密码时首选的编码方案。唯一允许的值是大小写不敏感的字符串 UTF-8。这与域字符串的编码无关。

摘要认证指令

<realm> 可选

上所述<realm>,指示要使用的用户名/密码。最少应包含主机名,但可能指示有权访问的用户或组。

domain 可选

一个带引号的、空格分隔的 URI 前缀列表,定义了可以使用认证信息的所有位置。如果未指定此键,则认证信息可以在 Web 根目录的任何位置使用。

nonce

一个服务器指定的带引号字符串,服务器可以使用它来控制特定凭据被视为有效的生命周期。这必须在每次发出 401 响应时唯一生成,并且可以更频繁地重新生成(例如,允许摘要只使用一次)。规范中包含了生成此值的可能算法的建议。nonce 值对客户端是不透明的。

opaque

一个服务器指定的带引号字符串,应在 Authorization 中原样返回。这对于客户端是不透明的。建议服务器包含 Base64 或十六进制数据。

stale 可选

一个不区分大小写的标志,指示客户端之前的请求因使用的 nonce 太旧(stale)而被拒绝。如果此值为 true,则可以使用相同的用户名/密码(使用新的 nonce 加密)重试请求。如果是任何其他值,则用户名/密码无效,必须从用户处重新请求。

algorithm 可选

一个字符串,指示用于生成摘要的算法。有效的非会话值为:MD5(如果未指定 algorithm 则为默认值)、SHA-256SHA-512。有效的会话值为:MD5-sessSHA-256-sessSHA-512-sess

qop

带引号的字符串,指示服务器支持的保护质量。此项必须提供,并且必须忽略无法识别的选项。

  • "auth":认证
  • "auth-int":带完整性保护的认证
charset="UTF-8" 可选

告诉客户端服务器提交用户名和密码时首选的编码方案。唯一允许的值是不区分大小写的字符串 "UTF-8"。

userhash 可选

服务器可以指定 "true" 来表示它支持用户名哈希(默认为 "false"

HTTP 源绑定认证 (HOBA)

<challenge>

一组 <len>:<value> 格式的对串联在一起,提供给客户端。质询由 nonce、算法、源、域、密钥标识符和质询本身组成。

<max-age>

从 HTTP 响应发出之时起,此质询的响应可以被接受的秒数。

<realm> 可选

如上文指令部分所述。

示例

发出多个认证质询

单个响应头中可以指定多个质询

http
HTTP/1.1 401 Unauthorized
WWW-Authenticate: challenge1, …, challengeN

可以在同一响应中的不同 WWW-Authenticate 头中发送多个质询。

http
HTTP/1.1 401 Unauthorized
WWW-Authenticate: challenge1
WWW-Authenticate: challengeN

基本认证

只支持基本认证的服务器可能有一个如下所示的 WWW-Authenticate 响应头

http
HTTP/1.1 401 Unauthorized
WWW-Authenticate: Basic realm="Staging server", charset="UTF-8"

接收到此头的用户代理会首先提示用户输入其用户名和密码,然后使用 Authorization 头中的编码凭据重新请求资源。Authorization 头可能如下所示

http
Authorization: Basic YWxhZGRpbjpvcGVuc2VzYW1l

对于 Basic 认证,凭据的构造方法是:首先用冒号(aladdin:opensesame)组合用户名和密码,然后将结果字符串用 base64 编码(YWxhZGRpbjpvcGVuc2VzYW1l)。

注意:另请参阅 HTTP 认证,了解如何配置 Apache 或 Nginx 服务器以使用 HTTP 基本认证保护您的站点的示例。

带有 SHA-256 和 MD5 的摘要认证

注意:此示例取自 RFC 7616 “HTTP 摘要访问认证”(规范中的其他示例展示了 SHA-512charsetuserhash 的使用)。

客户端尝试访问 URI http://www.example.org/dir/index.html 上的文档,该文档通过摘要认证进行保护。此文档的用户名是“Mufasa”,密码是“Circle of Life”(请注意每个单词之间有一个空格)。

客户端第一次请求文档时,未发送 Authorization 字段。此时,服务器以 HTTP 401 消息响应,其中包含它支持的每个摘要算法的质询,按其偏好顺序(SHA256,然后是 MD5

http
HTTP/1.1 401 Unauthorized
WWW-Authenticate: Digest
    realm="http-auth@example.org",
    qop="auth, auth-int",
    algorithm=SHA-256,
    nonce="7ypf/xlj9XXwfDPEoM4URrv/xwf94BcCAzFZH4GiTo0v",
    opaque="FQhe/qaU925kfnzjCev0ciny7QMkPqMAFRtzCUYo5tdS"
WWW-Authenticate: Digest
    realm="http-auth@example.org",
    qop="auth, auth-int",
    algorithm=MD5,
    nonce="7ypf/xlj9XXwfDPEoM4URrv/xwf94BcCAzFZH4GiTo0v",
    opaque="FQhe/qaU925kfnzjCev0ciny7QMkPqMAFRtzCUYo5tdS"

客户端提示用户输入其用户名和密码,然后发送一个新请求,该请求在 Authorization 字段中编码了凭据。如果客户端选择了 MD5 摘要,则 Authorization 字段可能如下所示

http
Authorization: Digest username="Mufasa",
    realm="http-auth@example.org",
    uri="/dir/index.html",
    algorithm=MD5,
    nonce="7ypf/xlj9XXwfDPEoM4URrv/xwf94BcCAzFZH4GiTo0v",
    nc=00000001,
    cnonce="f2/wE4q74E6zIJEtWaHKaf5wv/H5QzzpXusqGemxURZJ",
    qop=auth,
    response="8ca523f5e9506fed4657c9700eebdbec",
    opaque="FQhe/qaU925kfnzjCev0ciny7QMkPqMAFRtzCUYo5tdS"

如果客户端选择了 SHA-256 摘要,则 Authorization 字段可能如下所示

http
Authorization: Digest username="Mufasa",
    realm="http-auth@example.org",
    uri="/dir/index.html",
    algorithm=SHA-256,
    nonce="7ypf/xlj9XXwfDPEoM4URrv/xwf94BcCAzFZH4GiTo0v",
    nc=00000001,
    cnonce="f2/wE4q74E6zIJEtWaHKaf5wv/H5QzzpXusqGemxURZJ",
    qop=auth,
    response="753927fa0e85d155564e2e272a28d1802ca10daf449
        6794697cf8db5856cb6c1",
    opaque="FQhe/qaU925kfnzjCev0ciny7QMkPqMAFRtzCUYo5tdS"

HOBA 认证

支持 HOBA 认证的服务器可能有一个如下所示的 WWW-Authenticate 响应头

http
HTTP/1.1 401 Unauthorized
WWW-Authenticate: HOBA max-age="180", challenge="16:MTEyMzEyMzEyMw==1:028:https://www.example.com:8080:3:MTI48:NjgxNDdjOTctNDYxYi00MzEwLWJlOWItNGM3MDcyMzdhYjUz"

待签名 blob 质询由以下部分组成:www.example.com 使用端口 8080,nonce 是 1123123123,签名算法是 RSA-SHA256,密钥标识符是 123,最后质询是 68147c97-461b-4310-be9b-4c707237ab53

客户端将接收此头,提取质询,使用与示例中密钥标识符 123 对应的私钥和 RSA-SHA256 进行签名,然后将结果作为点分隔的密钥 ID、质询、nonce 和签名发送到 Authorization 头中。

http
Authorization: 123.16:MTEyMzEyMzEyMw==1:028:https://www.example.com:8080:3:MTI48:NjgxNDdjOTctNDYxYi00MzEwLWJlOWItNGM3MDcyMzdhYjUz.1123123123.<signature-of-challenge>

规范

规范
HTTP 语义
# field.www-authenticate

浏览器兼容性

另见