[7] [[HTTP認証]]の [[challenge]] や [[credentials]] における[[引数][引数 (HTTP)]]は [DFN[[CODE(ABNF)[[[auth-param]]]]]] [SRC[>>3]]
や [DFN[[[authentication parameter]]]] [SRC[>>3]] と呼ばれています。

[83] [CODE(HTTP)@en[Authentication-Control:]] [[ヘッダー]]では、
[CODE[auth-param]] と似て非なる [DFN[[CODE[auth-control-param]]]] 
[SRC[>>82]] が使われています。

* 仕様書

[REFS[
- [3] '''[CITE@en[RFC 7235 - Hypertext Transfer Protocol (HTTP/1.1): Authentication]] ([TIME[2014-09-11 10:01:28 +09:00]] 版) <https://tools.ietf.org/html/rfc7235#section-2.1>'''
- [67] [CITE@en[RFC 7235 - Hypertext Transfer Protocol (HTTP/1.1): Authentication]] ([TIME[2014-09-11 10:01:28 +09:00]] 版) <https://tools.ietf.org/html/rfc7235#section-5.1.2>
- [50] [CITE@en[RFC 5849 - The OAuth 1.0 Protocol]] ([TIME[2012-03-04 10:51:49 +09:00]] 版) <http://tools.ietf.org/html/rfc5849#section-3.5.1>
- [82] [CITE@en[RFC 8053 - HTTP Authentication Extensions for Interactive Clients]] ([TIME[2017-01-26 12:13:39 +09:00]]) <https://tools.ietf.org/html/rfc8053#section-4>
- [85] [CITE@en[RFC 8120 - Mutual Authentication Protocol for HTTP]] ([TIME[2017-04-20 12:04:06 +09:00]]) <https://tools.ietf.org/html/rfc8120#section-3.1>
]REFS]

* 構文

[5] [CODE(ABNF)@en[[[auth-param]]]] は、名前と値の組を [CODE[[[=]]]]
で連結したものです。 [CODE[[[=]]]] の前後には [[BWS]] が挟まります。 [SRC[>>3]]

[33] 名前は[[字句]]です。[[大文字・小文字不区別]]です。 [SRC[>>3]]

[HISTORY[
[14] [[RFC 1945]] / [[RFC 2068]] は [CODE(HTTP)@en[[[realm]]]] [[属性]]以外について[[大文字]]と[[小文字]]の解釈を明記していませんでした。
]HISTORY]

[63] 値は[[字句]]または[[引用文字列]]です。 [SRC[>>3]]

[FIG(railroad)[
= [[字句]]
= [CODE[[[=]]]]
= |
== [[字句]]
== [[引用文字列]]
]FIG]

;; [34] [[引数]]も参照。

[HISTORY[
[2] [[RFC 1945]] と [[RFC 2068]] では値は[[引用文字列]]とされていました。
[[RFC 2617]] 以後[[字句]]も認められています。

[22] [[RFC 1945]] と [[RFC 2068]] の定義では必ず[[引用文字列]]とすることになっていましたが、 
[[RFC 2069]] ではそうなっていない構文が定義されており、矛盾していました。
]HISTORY]

[36] 更に、各[[引数]]について個別の値の構文が定義されています。

[HISTORY[
[68] [[RFC 2616]] 世代までは、例によって[[引数]]ごとの個別の [[ABNF]]
構文は [[quoted-string]] の[[引用符]]まで含めて特定の構文を決める形になっていました。
現実にはまず [[token]] または [[quoted-string]] として構文解析した後にその値の部分を取り出して処理するのが一般的だと思われます。 [[RFC 723x]] 世代からはそのような形に改められています。
[[RFC 7235]] もそのように定義することを[RUBYB[求めて]@en[ought to]]います [SRC[>>67]]。
]HISTORY]

[69] [CODE(HTTP)@en[[[realm]]]] [[引数]]の値は[[字句]]ではなく[[引用文字列]]としなければならないとされています。ただしこのような制限は新しい[[引数]]には設ける[RUBYB[べきではない]@en[ought to]]とされています
[SRC[>>67]]。

[80] [CODE(HTTP)@en[[[Authentication-Info:]]]]/[CODE(HTTP)@en[[[Proxy-Authentication-Info:]]]]
については、原則として[[字句]]と[[引用文字列]]の両方の送受信に対応するべきこと、
[[後方互換性]]のためどちらで送信するべきか規定できることが [[RFC]]
で説明されています。

;; 両[[ヘッダー]]の項を参照。

** 文字コード

[64] [[RFC 2616]] までは[[ヘッダー]]の[[文字コード]]は [CODE(charset)@en[[[ISO-8859-1]]]]
とされていましたが、 [[RFC 723x]] では [CODE(charset)@en[[[US-ASCII]]]]
になっており、[[8ビット]]の[[オクテット]]の解釈は不明となっています。

[65] 実際には[[利用者名]]や[[合言葉]]などで[[非ASCII文字]]が使われることがあります。
その扱いは [CODE(ABNF)@en[[[auth-scheme]]]] に依りますが、明確に規定されているものもあれば、
されていないものもあります。

[66] [[OAuth 1.0]] では[[パーセント符号化]]を使っています (>>55)。

-*-*-

[81] [[ダイジェスト認証]]の [CODE[[[username]]]]/[CODE[[[username*]]]]
[[引数]]では、 [[RFC 5987]] の拡張が使われています。

[86] [CODE[Mutual]] では、 [[credentials]], [[challenge][challenge (HTTP)]],
[CODE(HTTP)@en[[[Authentication-Info:]]]]/[CODE(HTTP)@en[[[Proxy-Authentication-Info:]]]]
で [[RFC 5987]] の拡張が使われています。ただし [CODE[realm]] [[引数]]では禁止されています。
[SRC[>>85]]

[REFS[
- [21] [CITE[Bug 41489 - http authentication does not support non-ASCII characters]] <https://bugzilla.mozilla.org/show_bug.cgi?id=41489>
]REFS]

* [CODE(ABNF)@en[auth-param]] のリスト

[13] [CODE(ABNF)@en[[[auth-param]]]] は[[引数]]の1対ですが、実際には[[リスト]]
([CODE(HTTP)[#]]) として用いられます。

[FIG(railroad)[
= ?
== [CODE(ABNF)@en[[[auth-param]]]]
== *
=== [[FWS]]
=== [CODE(HTTP)[[[,]]]]
=== [[FWS]]
=== [CODE(ABNF)@en[[[auth-param]]]]
]FIG]

[6] [[MIME]] や [[HTTP]] の他の[[ヘッダー]]では[[引数]]は [CODE(char)[[[;]]]]
で区切るのが普通ですが、 [CODE(ABNF)@en[[[auth-param]]]] のリストでは
[CODE(char)[[[,]]]] で区切ります。

;; [9] そのため [CODE(HTTP)@en[[[WWW-Authenticate:]]]] や [CODE(HTTP)@en[[[Proxy-Authenticate:]]]]
や [CODE(HTTP)@en[[[Authorization:]]]] は[[HTTPヘッダーの連結]]の処理の際に注意が必要です。

;; [35] 古くは [[HTTP]] では[[引数]]の区切りは [CODE(HTTP)[[[,]]]] でしたが、
[[MIME]] に揃えるため [[RFC 1945]] 時代より前に [CODE(HTTP)[[[;]]]] に変更されました。
なぜ [CODE(ABNF)@en[[[auth-param]]]] だけ [CODE(HTTP)[[[,]]]] のまま残ったのかは不明ですが、
他の[[引数]]を値とする[[ヘッダー]]は理論上存在しても実際には使われていなかった一方、
[[認証]]は早くからしばしば用いられていたため変更できなかったのかもしれません。

[15] [[challenge]] では [SRC[>>3]] 同じ名前の[[引数]]を複数回使うことは認められていません。

[12] [[credentials]] では順序は特に規定されていないようです。

;; [11] [[RFC 1945]]/[[RFC 2068]] の定義では、
[[誰何]]においては [CODE(HTTP)@en[[[realm]]]] [[引数]]は唯一、 [CODE(HTTP)@en[[[auth-scheme]]]] 
に関わらず必須で構文的にも最初に定義されている特殊な[[引数]]でした。
ただ最初の[[引数]]でなければならないのが [[ABNF]] 構文の定義上のものなのか、
現実にそうでなければならない要件なのかははっきりしませんでした。

[84] [CODE[auth-control-param]] は似ていますが、少し違います。
[[RFC 5987]] の拡張構文にも対応しています。

* OAuth 1.0 用の表現

[51] [[OAuth 1.0]] では[[プロトコル引数]]を [CODE(HTTP)@en[[[Authorization:]]]] 
[[ヘッダー]]で [CODE(ABNF)@en[[[auth-param]]]] として指定することができ、
その場合の構文が [[HTTP]] 本体よりも厳密に規定されています。 [SRC[>>50]]

[FIG(list)[
- [55] [[引数]]の名前と値はまず [[OAuth 1.0パーセント符号化]]しておきます。
- [52] [[引数]]の名前と値の間に [[LWS]] を入れることはできません。
- [53] [[引数]]の値は[[引用文字列]]としなければなりません。
- [54] [[引数]]の値で [[quoted-pair]] は使いません。
- [56] [[引数]]の区切りには [CODE(HTTP)[[[,]]]] と [CODE(charname)@en[[[SP]]]]、
または [CODE(HTTP)[[[,]]]] だけを使います。
]FIG]

;; [16] [[引数]]の名前は[[字句]]なので、 [CODE[[[%]]]] を含めることができます。

[75] 解釈の方法はなぜか規定されていません。[[記号]]や[[非ASCII文字]]の値が含まれることがあり得るので、
それをどう処理するか規定がないと[[相互運用性]]に影響しそうですが・・・。

;; [[consumer key]] や [[access token]] に[[記号]]や[[非ASCII文字]]を含めるのは、
避けるべきでしょう。

[76] この構文で[[符号化]]される値については、[[要求引数]]を参照。

* 文脈

[20] [CODE(ABNF)@en[[[auth-param]]]] は[[リスト]] ([CODE(HTTP)[#]])
として用いられます。

[17] [[challenge]] ([[誰何]]) では、 [CODE(HTTP)@en[[[auth-scheme]]]] 
に続けて指定し、必要な[[認証]]についての追加情報を表します。

[18] [[credentials]] では、 [CODE(HTTP)@en[[[auth-scheme]]]]
に続けて指定し、[[認証]]に必要な情報を表します。

[77] [CODE(HTTP)@en[[[Authentication-Info:]]]], [CODE(HTTP)@en[[[Proxy-Authentication-Info:]]]]
両[[ヘッダー]]でも使われています。

* 未知の引数

[70] 未知の[[引数]]についての共通の処理の方法はありません。
[[認証方式]]を定義する際はどのように扱うか決める[RUBYB[べき]@en[ought to]]とされています
[SRC[>>67]]。その際、「理解しなければならない」ではなく「無視しなければならない」
とするのが[RUBYB[好ましい]@en[prefer]]とされています [SRC[>>67]]。
また新しい[[引数]]を規定する方法 ([[仕様書]]の改訂や登録簿など) も定める[RUBYB[べき]@en[ought to]]とされています
[SRC[>>67]]。

[38] [[Digest認証]]では未知の[[引数]]は無視し[['''なければなりません''']] [SRC[>>39, >>42]]。

* 引数の一覧

[78] [[challenge]] や [[credentials]] では、次のような[[引数]]が用いられます。

[FIG(list)[
- [CODE(HTTP)@en[[[Challenge]]]] ([CODE(HTTP)@en[[[Remote-Passphrase]]]] [[challenge]], [[credentials]])
- [59] [CODE(HTTP)@en[[[Credential]]]] ([CODE(HTTP)@en[[[AWS4-HMAC-SHA256]]]] [[誰何]])
- [60] [CODE(HTTP)@en[[[SignedHeaders]]]] ([CODE(HTTP)@en[[[AWS4-HMAC-SHA256]]]] [[誰何]])
- [61] [CODE(HTTP)@en[[[Signature]]]] ([CODE(HTTP)@en[[[AWS4-HMAC-SHA256]]]] [[誰何]])
- [27] [CODE(HTTP)@en[[[algorithm]]]] ([[Digest]] [[誰何]], [[credentials]])
- [CODE(HTTP)@en[[[apikey]]]] ([CODE(HTTP)@en[[[AdobeAuth]]]] [[challenge]])
- [58] [CODE(HTTP)@en[[[auth]]]] ([[GoogleLogin]] [[credentials]])
- [CODE(HTTP)@en[[[authorization_uri]]]] ([CODE(HTTP)@en[[[Bearer]]]] [[誰何]])
- [CODE(HTTP)@en[[[charset]]]]
- [CODE(HTTP)@en[[[challenge]]]] ([CODE(HTTP)@en[[[HOBA]]]] [[challenge]])
- [40] [CODE(HTTP)@en[[[cnonce]]]] ([[Digest]] [[credentials]])
- [CODE(HTTP)@en[data]]
- [CODE(HTTP)@en[date]]
- [31] [CODE(HTTP)@en[[[digest]]]] ([[Digest]] [[credentials]])
- [23] [CODE(HTTP)@en[[[domain]]]] ([[Digest]] [[誰何]])
- [62] [CODE(HTTP)@e[[[entity]]]] ([CODE(HTTP)@en[[[PEM]]]] [[credentials]])
- [CODE(HTTP)@en[[[error]]]] ([CODE(HTTP)@en[[[Bearer]]]] [[challenge]])
- [CODE(HTTP)@en[[[error_description]]]] ([CODE(HTTP)@en[[[Bearer]]]] [[challenge]])
- [CODE(HTTP)@en[[[error_uri]]]] ([CODE(HTTP)@en[[[Bearer]]]] [[challenge]])
- [CODE(HTTP)@en[k][vapid]]
- [CODE(HTTP)@en[key]]
- [CODE(HTTP)@en[[[keyuri]]]]
- [CODE(HTTP)@en[[[max-age]]]] ([CODE(HTTP)@en[[[HOBA]]]] [[challenge]])
- [41] [CODE(HTTP)@en[[[nc]]]] ([[Digest]] [[credentials]])
- [24] [CODE(HTTP)@en[[[nonce]]]] ([[Digest]] [[誰何]])
- [CODE(HTTP)@en[[[oauth_acceptable_versions]]]] ([CODE(HTTP)@en[[[OAuth]]]] [[challenge]])
- [CODE(HTTP)@en[[[oauth_acceptable_timestamps]]]] ([CODE(HTTP)@en[[[OAuth]]]] [[challenge]])
- [43] [CODE(HTTP)@en[[[oauth_consumer_key]]]] ([[OAuth]] [[credentials]])
- [CODE(URI)@en[[[oauth_error_in_response_body]]]] ([CODE(HTTP)@en[[[OAuth]]]] [[credentials]])
- [48] [CODE(HTTP)@en[[[oauth_nonce]]]] ([[OAuth]] [[credentials]])
- [CODE(HTTP)@en[[[oauth_parameters_absent]]]] ([CODE(HTTP)@en[[[OAuth]]]] [[challenge]])
- [CODE(HTTP)@en[[[oauth_parameters_rejected]]]] ([CODE(HTTP)@en[[[OAuth]]]] [[challenge]])
- [57] [CODE(HTTP)@en[[[oauth_problem]]]] ([CODE(HTTP)@en[[[OAuth]]]] [[challenge]])
- [CODE(HTTP)@en[[[oauth_problem_advice]]]] ([CODE(HTTP)@en[[[OAuth]]]] [[challenge]])
- [CODE(URI)@en[[[oauth_scope]]]] ([CODE(HTTP)@en[[[OAuth]]]] [[credentials]])
- [CODE(URI)@en[[[oauth_session_handle]]]] ([CODE(HTTP)@en[[[OAuth]]]] [[credentials]])
- [45] [CODE(HTTP)@en[[[oauth_signature_method]]]] ([[OAuth]] [[credentials]])
- [46] [CODE(HTTP)@en[[[oauth_signature]]]] ([[OAuth]] [[credentials]])
- [47] [CODE(HTTP)@en[[[oauth_timestamp]]]] ([[OAuth]] [[credentials]])
- [44] [CODE(HTTP)@en[[[oauth_token]]]] ([[OAuth]] [[credentials]])
- [CODE(URI)@en[[[oauth_token_attributes]]]] ([CODE(HTTP)@en[[[OAuth]]]] [[credentials]])
- [49] [CODE(HTTP)@en[[[oauth_version]]]] ([[OAuth]] [[credentials]])
- [25] [CODE(HTTP)@en[[[opaque]]]] ([[Digest]] [[誰何]], [[credentials]])
- [37] [CODE(HTTP)@en[[[qop]]]] ([[Digest]] [[誰何]], [[credentials]])
- [CODE(HTTP)@en[[[resource_id]]]] ([CODE(HTTP)@en[[[Bearer]]]] [[誰何]])
- [30] [CODE(HTTP)@en[[[response]]]] ([[Digest]] [[credentials]])
- [CODE(HTTP)@en[[[result]]]] ([CODE(HTTP)@en[[[HOBA]]]] [[credentials]])
- [CODE(HTTP)@en[[[scope]]]] ([CODE(HTTP)@en[[[Bearer]]]] [[challenge]])
- [CODE(HTTP)@en[[[sessionid]]]] ([CODE(HTTP)@en[[[AdobeAuth]]]] [[challenge]])
- [CODE(HTTP)@en[[[sig]]]] ([CODE(HTTP)@en[[[AdobeAuth]]]] [[challenge]])
- [CODE(HTTP)@en[signature]]
- [CODE(HTTP)@en[[[source]]]]
- [26] [CODE(HTTP)@en[stale]]
- [10] [CODE(HTTP)@en[[[realm]]]] ([[challenge]], [CODE(HTTP)@en[[[Remote-Passphrase]]]] [[credentials]])
- [CODE(HTTP)@en[[[Realms]]]] ([CODE(HTTP)@en[[[Remote-Passphrase]]]] [[challenge]])
- [CODE(HTTP)@en[[[Response]]]] ([CODE(HTTP)@en[[[Remote-Passphrase]]]] [[challenge]], [[credentials]])
- [CODE(HTTP)@en[[[Security-Context]]]] ([CODE(HTTP)@en[[[Remote-Passphrase]]]] [[challenge]], [[credentials]])
- [CODE(HTTP)@en[[[Session-Key]]]] ([CODE(HTTP)@en[[[Remote-Passphrase]]]] [[challenge]])
- [CODE(HTTP)@en[sid]]
- [CODE(HTTP)@en[sr]]
- [CODE(HTTP)@en[[[State]]]] ([CODE(HTTP)@en[[[Remote-Passphrase]]]] [[challenge]], [[credentials]])
- [CODE[t][vapid]]
- [CODE(HTTP)@en[[[ticket]]]] ([CODE(HTTP)@en[[[AdobeAuth]]]] [[challenge]])
- [CODE(HTTP)@en[[[Timestamp]]]] ([CODE(HTTP)@en[[[Remote-Passphrase]]]] [[challenge]])
- [CODE(HTTP)@en[[[token]]]] ([CODE(HTTP)@en[[[Token]]]] [[credentials]])
- [CODE(HTTP)@en[ttl]]
- [29] [CODE(HTTP)@en[[[uri]]]] ([[Digest]] [[credentials]])
- [CODE(HTTP)@en[[[user-auth]]]] ([CODE(HTTP)@en[[[SFLY]]]] [[credentials]])
- [CODE(HTTP)@en[[[userhash]]]]
- [28] [CODE(HTTP)@en[[[username]]]] ([[Digest]] [[credentials]], [CODE(HTTP)@en[[[Remote-Passphrase]]]] [[credentials]])
]FIG]

[HISTORY[
[8] [[RFC 1945]] と [[RFC 2068]] では [[ABNF]] 構文上 [CODE(HTTP)@en[[[realm]]]] [[引数]]は
[CODE(ABNF)@en[[[auth-param]]]] に含まれないことになっていました。 [[RFC 2069]] と
[[RFC 2617]] と [[RFC 7235]] では [CODE(HTTP)@en[[[realm]]]] も [CODE(ABNF)@en[[[auth-param]]]] の部分に含まれています。
]HISTORY]

[74] >>73 に [[SIP]] に関する [[IANA登録簿]]があります。

[88] >>87 に [CODE[vapid]] に関する[[IANA登録簿]]があります。

[REFS[
- [73] [CITE[Session Initiation Protocol (SIP) Parameters]] ([TIME[2014-11-13 16:25:40 +09:00]] 版) <http://www.iana.org/assignments/sip-parameters/sip-parameters.xhtml#sip-parameters-12>
- [87] [CITE[Web Push Parameters]], [TIME[2017-12-27 01:57:03 +09:00]] <https://www.iana.org/assignments/webpush-parameters/webpush-parameters.xhtml>
]REFS]

[72] [[JSON]] 形式の一覧データファイルが >>71 にあります。
[REFS[
- [71] [CITE@en[data-web-defs/headers.txt at master · manakai/data-web-defs]] ([TIME[2014-10-22 15:33:28 +09:00]] 版) <https://github.com/manakai/data-web-defs/blob/master/doc/headers.txt>
]REFS]

[79] [CODE(HTTP)@en[[[Authentication-Info:]]]] や [CODE(HTTP)@en[[[Proxy-Authentication-Info:]]]]
で用いられるものについては、そちらの項を参照。

* 歴史

** RFC 第1世代 (RFC 1945)

[REFS[
- [1] [CITE@en[RFC 1945 - Hypertext Transfer Protocol -- HTTP/1.0]] ([TIME[2012-02-18 23:25:56 +09:00]] 版) <http://tools.ietf.org/html/rfc1945#section-11>
]REFS]

** RFC 第2世代 (RFC 2068)

[REFS[
- [19] [CITE@en[RFC 2068 - Hypertext Transfer Protocol -- HTTP/1.1]] ([TIME[2012-02-18 23:30:14 +09:00]] 版) <http://tools.ietf.org/html/rfc2068#section-11>
]REFS]

** RFC 第3世代 (RFC 2617)

[REFS[
- [32] '''[CITE@en[RFC 2617 - HTTP Authentication: Basic and Digest Access Authentication]] ([TIME[2012-01-09 21:04:30 +09:00]] 版) <http://tools.ietf.org/html/rfc2617#section-1.2>'''
- [39] [CITE@en[RFC 2617 - HTTP Authentication: Basic and Digest Access Authentication]] ([TIME[2012-01-09 21:04:30 +09:00]] 版) <http://tools.ietf.org/html/rfc2617#page-11>
- [42] [CITE@en[RFC 2617 - HTTP Authentication: Basic and Digest Access Authentication]] ([TIME[2012-01-09 21:04:30 +09:00]] 版) <http://tools.ietf.org/html/rfc2617#page-12>
]REFS]

** RFC 第4世代 (RFC 7235)

[REFS[
- [4] '''[CITE@en[RFC 7235 - Hypertext Transfer Protocol (HTTP/1.1): Authentication]] ([TIME[2014-09-11 10:01:28 +09:00]] 版) <https://tools.ietf.org/html/rfc7235#section-2.1>'''
]REFS]