WWW-Authenticate
HTTP 的 WWW-Authenticate
响应头定义了用于访问特定资源的 HTTP 身份验证 方法(“挑战”)。
注意:此标头是 通用 HTTP 身份验证框架 的一部分,可与多种 身份验证方案 一起使用。每个“挑战”都列出了服务器支持的方案以及为该方案类型定义的其他参数。
使用 HTTP 身份验证 的服务器将对受保护资源的请求以 401
Unauthorized
响应进行响应。此响应必须至少包含一个 WWW-Authenticate
标头和至少一个 挑战,以指示可以使用哪些身份验证方案访问资源(以及每个特定方案需要的任何其他数据)。
在一个 WWW-Authenticate
标头中允许使用多个挑战,在一个响应中也允许使用多个 WWW-Authenticate
标头。服务器还可以在其他响应消息中包含 WWW-Authenticate
标头,以指示提供凭据可能会影响响应。
在收到 WWW-Authenticate
标头后,客户端通常会提示用户输入凭据,然后重新请求资源。此新请求使用 Authorization
标头向服务器提供凭据,并根据所选“挑战”身份验证方法进行适当编码。客户端应选择其理解的安全性最高的挑战(请注意,在某些情况下,“安全性最高”的方法存在争议)。
语法
必须指定至少一个挑战。可以在单个标头或各个标头中指定多个挑战,以逗号分隔。
// Challenges specified in single header
WWW-Authenticate: challenge1, ..., challengeN
// Challenges specified in multiple headers
WWW-Authenticate: challenge1
...
WWW-Authenticate: challengeN
单个挑战具有以下格式。请注意,方案令牌(<auth-scheme>
)是必需的。realm
、token68
和任何其他参数的存在取决于所选方案的定义。
// 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
。
WWW-Authenticate: Basic realm=<realm>
WWW-Authenticate: Basic realm=<realm>, charset="UTF-8"
指令
<auth-scheme>
-
身份验证方案。一些更常见的类型(不区分大小写)为:
Basic
、Digest
、Negotiate
和AWS4-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
响应标头
WWW-Authenticate: Basic realm="Access to the staging site", charset="UTF-8"
接收此标头的用户代理首先会提示用户输入用户名和密码,然后重新请求资源:这次在 Authorization
标头中包含(编码的)凭据。Authorization
标头可能如下所示
Authorization: Basic YWxhZGRpbjpvcGVuc2VzYW1l
对于 "Basic"
身份验证,凭据是通过首先将用户名和密码与冒号(aladdin:opensesame
)组合,然后对生成的字符串进行 base64
编码(YWxhZGRpbjpvcGVuc2VzYW1l
)来构建的。
注意:另请参阅 HTTP 身份验证,以获取有关如何配置 Apache 或 Nginx 服务器以使用 HTTP 基本身份验证保护站点的示例。
使用 SHA-256 和 MD5 的摘要身份验证
注意:此示例取自 RFC 7616“HTTP 摘要访问身份验证”(规范中的其他示例显示了 SHA-512
、charset
和 userhash
的用法)。
客户端尝试访问 URI http://www.example.org/dir/index.html
处的文档,该文档通过摘要身份验证进行保护。此文档的用户名为“Mufasa”,密码为“Circle of Life”(请注意单词之间的单个空格)。
客户端第一次请求文档时,不会发送 Authorization
标头字段。在此,服务器将以包含对每个摘要算法的挑战(按其优先级顺序:SHA256
然后是 MD5
)的 HTTP 401 消息进行响应
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
标头字段可能如下所示
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
标头字段可能如下所示
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
响应标头
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
标头中。
Authorization: 123.16:MTEyMzEyMzEyMw==1:028:https://www.example.com:80800:3:MTI48:NjgxNDdjOTctNDYxYi00MzEwLWJlOWItNGM3MDcyMzdhYjUz.1123123123.<signature-of-challenge>
规范
规范 |
---|
HTTP 语义 # field.www-authenticate |
浏览器兼容性
BCD 表仅在启用了 JavaScript 的浏览器中加载。