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

瀏覽器相容性

另見