WWW-Authenticate

HTTP 的 WWW-Authenticate 响应头定义了用于访问特定资源的 HTTP 身份验证 方法(“挑战”)。

注意:此标头是 通用 HTTP 身份验证框架 的一部分,可与多种 身份验证方案 一起使用。每个“挑战”都列出了服务器支持的方案以及为该方案类型定义的其他参数。

使用 HTTP 身份验证 的服务器将对受保护资源的请求以 401 Unauthorized 响应进行响应。此响应必须至少包含一个 WWW-Authenticate 标头和至少一个 挑战,以指示可以使用哪些身份验证方案访问资源(以及每个特定方案需要的任何其他数据)。

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

在收到 WWW-Authenticate 标头后,客户端通常会提示用户输入凭据,然后重新请求资源。此新请求使用 Authorization 标头向服务器提供凭据,并根据所选“挑战”身份验证方法进行适当编码。客户端应选择其理解的安全性最高的挑战(请注意,在某些情况下,“安全性最高”的方法存在争议)。

标头类型 响应标头
禁止的标头名称

语法

必须指定至少一个挑战。可以在单个标头或各个标头中指定多个挑战,以逗号分隔。

http
// Challenges specified in single header
WWW-Authenticate: challenge1, ..., challengeN

// Challenges specified in multiple headers
WWW-Authenticate: challenge1
...
WWW-Authenticate: challengeN

单个挑战具有以下格式。请注意,方案令牌(<auth-scheme>)是必需的。realmtoken68 和任何其他参数的存在取决于所选方案的定义。

http
// Possible challenge formats (scheme dependent)
WWW-Authenticate: <auth-scheme>
WWW-Authenticate: <auth-scheme> realm=<realm>
WWW-Authenticate: <auth-scheme> token68
WWW-Authenticate: <auth-scheme> auth-param1=token1, ..., auth-paramN=auth-paramN-token
WWW-Authenticate: <auth-scheme> realm=<realm> token68
WWW-Authenticate: <auth-scheme> realm=<realm> token68 auth-param1=auth-param1-token , ..., auth-paramN=auth-paramN-token
WWW-Authenticate: <auth-scheme> realm=<realm> auth-param1=auth-param1-token, ..., auth-paramN=auth-paramN-token
WWW-Authenticate: <auth-scheme> token68 auth-param1=auth-param1-token, ..., auth-paramN=auth-paramN-token

例如,基本身份验证 需要 realm 并允许可选使用 charset 密钥,但不支持 token68

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

指令

<auth-scheme>

身份验证方案。一些更常见的类型(不区分大小写)为:BasicDigestNegotiateAWS4-HMAC-SHA256

注意:有关更多信息/选项,请参阅 HTTP 身份验证 > 身份验证方案

realm=<realm> 可选

描述受保护区域的字符串。领域允许服务器将其保护的区域进行分区(如果所选方案支持此类分区)。一些客户端会将此值显示给用户,以告知他们需要哪些特定凭据——尽管大多数浏览器已停止这样做以防止网络钓鱼。此值的唯一可靠支持字符集为 us-ascii。如果未指定领域,客户端通常会改显示格式化的主机名。

<token68> 可选

可能对某些方案有用的令牌。该令牌允许 66 个未保留的 URI 字符以及其他一些字符。根据规范,它可以保存 base64、base64url、base32 或 base16(十六进制)编码,带或不带填充,但不包括空格。

<auth-scheme> 和密钥 realm 外,授权参数特定于每个 身份验证方案。通常,您需要检查相关规范以获取这些信息(下面列出了少量方案的密钥)。

基本

<realm>

上文 所述。请注意,基本身份验证需要领域。

charset="UTF-8" 可选

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

摘要

<realm> 可选

指示要使用哪个用户名/密码的字符串。至少应包含主机名,但可能指示具有访问权限的用户或组。

domain 可选

定义可以使用身份验证信息的 所有位置的 URI 前缀的带引号的空格分隔列表。如果未指定此密钥,则身份验证信息可以在 Web 根目录的任何位置使用。

nonce

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

opaque

服务器指定的带引号的字符串,应在 Authorization 中保持不变地返回。这对客户端是不可见的。建议服务器包含 Base64 或十六进制数据。

stale 可选

指示客户端的先前请求被拒绝(因为使用的 nonce 过时)的不区分大小写的标志。如果此值为 true,则可以使用相同的用户名/密码(使用新的 nonce 加密)重试请求。如果此值为任何其他值,则用户名/密码无效,必须重新向用户请求。

algorithm 可选

用于生成摘要的算法。有效的非会话值为:"MD5"(如果未指定则为默认值)、"SHA-256""SHA-512"。有效的会话值为:"MD5-sess""SHA-256-sess""SHA-512-sess"

qop

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

  • "auth":身份验证
  • "auth-int":具有完整性保护的身份验证
charset="UTF-8" 可选

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

userhash 可选

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

HTTP 绑定源身份验证 (HOBA)

<challenge>

一组格式为“<len>:<value>”的配对,连接在一起提供给客户端。挑战由 nonce、算法、源、领域、密钥标识符和挑战组成。

<max-age>

从发出 HTTP 响应的时间开始,可以接受对该挑战的响应的秒数。

realm 可选

指令 部分中的上文所述。

示例

基本身份验证

仅支持基本身份验证的服务器可能具有如下所示的 WWW-Authenticate 响应标头

http
WWW-Authenticate: Basic realm="Access to the staging site", 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 标头字段。在此,服务器将以包含对每个摘要算法的挑战(按其优先级顺序:SHA256 然后是 MD5)的 HTTP 401 消息进行响应

http
HTTP/1.1 401 Unauthorized
WWW-Authenticate: Digest
    realm="[email protected]",
    qop="auth, auth-int",
    algorithm=SHA-256,
    nonce="7ypf/xlj9XXwfDPEoM4URrv/xwf94BcCAzFZH4GiTo0v",
    opaque="FQhe/qaU925kfnzjCev0ciny7QMkPqMAFRtzCUYo5tdS"
WWW-Authenticate: Digest
    realm="[email protected]",
    qop="auth, auth-int",
    algorithm=MD5,
    nonce="7ypf/xlj9XXwfDPEoM4URrv/xwf94BcCAzFZH4GiTo0v",
    opaque="FQhe/qaU925kfnzjCev0ciny7QMkPqMAFRtzCUYo5tdS"

客户端会提示用户输入用户名和密码,然后以新的请求进行响应,该请求在 Authorization 标头字段中对凭据进行编码。如果客户端选择了 MD5 摘要,则 Authorization 标头字段可能如下所示

http
Authorization: Digest username="Mufasa",
    realm="[email protected]",
    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="[email protected]",
    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
WWW-Authenticate: HOBA max-age="180", challenge="16:MTEyMzEyMzEyMw==1:028:https://www.example.com:80800:3:MTI48:NjgxNDdjOTctNDYxYi00MzEwLWJlOWItNGM3MDcyMzdhYjUz"

待签名的 Blob 挑战由以下部分组成:使用端口 8080 的 www.example.com,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:80800:3:MTI48:NjgxNDdjOTctNDYxYi00MzEwLWJlOWItNGM3MDcyMzdhYjUz.1123123123.<signature-of-challenge>

规范

规范
HTTP 语义
# field.www-authenticate

浏览器兼容性

BCD 表仅在启用了 JavaScript 的浏览器中加载。

另请参阅