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="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 標頭欄位可能如下所示
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 標頭欄位可能如下所示
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 響應標頭
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 的瀏覽器中載入。