[20] [DFN[[[challenge]]]] ([DFN[[RUBY[[[誰何]]][すいか]]]]) は、
[[HTTP認証]]において[[認証]]の方式と追加情報を記述し、
[[認証]]情報の送信を求めるものです。 [CODE(HTTP)@en[[[WWW-Authenticate:]]]]
[[ヘッダー]]で用いられています。

* 仕様書

[REFS[
- [6] '''[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>'''
- [17] [CITE@en[RFC 7231 - Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content]] ([TIME[2014-08-07 05:54:02 +09:00]] 版) <https://tools.ietf.org/html/rfc7231#section-7.3>
- [8] [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>
- [24] [CITE@en[RFC 5849 - The OAuth 1.0 Protocol]] ([TIME[2014-12-28 14:19:21 +09:00]] 版) <http://tools.ietf.org/html/rfc5849#section-3.5.1>
- [28] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2015-04-25 04:40:19 +09:00]] 版) <https://html.spec.whatwg.org/#navigate>
- [31] [CITE@en[RFC 7616 - HTTP Digest Access Authentication]] ([TIME[2015-11-10 07:05:08 +09:00]] 版) <https://tools.ietf.org/html/rfc7616#section-3.7>
- [34] [CITE@en[RFC 7616 - HTTP Digest Access Authentication]] ([TIME[2015-11-10 07:05:08 +09:00]] 版) <https://tools.ietf.org/html/rfc7616#section-5.6>
- [35] [CITE@en[RFC 7616 - HTTP Digest Access Authentication]] ([TIME[2015-11-10 07:05:08 +09:00]] 版) <https://tools.ietf.org/html/rfc7616#section-5.8>
]REFS]

* 構文

[3] [[challenge]] は、 [CODE(ABNF)@en[[[auth-scheme]]]] のみか、
その後に [CODE(ABNF)@en[[[auth-param]]]] の[[リスト]] ([CODE(HTTP)[#]])
または [CODE(ABNF)@en[[[token68]]]] を続けたものです。 [SRC[>>6]]

[4] [CODE(ABNF)@en[[[auth-scheme]]]] のみの場合を除き、その後ろに1文字以上の
[CODE(charname)[[[SP]]]] が必要です。 [SRC[>>6]]

;; [[HTTPにおける空白]]も参照。

[FIG(railroad)[
= [CODE(ABNF)@en[[[auth-scheme]]]]
= ?
== +
=== [CODE(charname)@en[[[SP]]]]
== |
=== [CODE(ABNF)@en[[[auth-param]]]] の[[リスト]] ([CODE(HTTP)[#]])
=== [CODE(ABNF)@en[[[token68]]]]
]FIG]

;; [2] [[RFC 1945]] と [[RFC 2068]] では [CODE(HTTP)@en[[[realm]]]] 
[[引数]]が最初の[[引数]]かつ必須とされていましたが、その後この制限はなくなっているようです。
更に [[RFC 7235]] で [CODE(ABNF)@en[[[token68]]]] も認められるようになりました。

[21] [CODE(ABNF)@en[[[auth-scheme]]]] より後の部分の構文は、
[CODE(ABNF)@en[[[auth-scheme]]]] ごとに異なります。

;; [22] 詳しくは [CODE(ABNF)@en[[[auth-scheme]]]] と各[[認証方式]]の項を参照。

[23] [CODE(ABNF)@en[[[token68]]]] は既存の[[認証方式]]の構文との互換性のためのもので、
新しい[[認証方式]]は使う[RUBYB[べきではありません]@en[ought to]] [SRC[>>8]]。

* 誰何の選択

[11] 1つの[[要求]]の [CODE(HTTP)@en[[[WWW-Authenticate:]]]] 欄には複数の[[誰何]]を含めることができます。
それぞれの[[誰何]]の [[auth-scheme]] は違っていても構いません。

[13] この時[[誰何]]の順は[[鯖]]が使って欲しい順序にするべきです。[[鯖]]はより「安全」
な方法を最初に持ってくるべきです。
[SRC[>>10]]

[12] また[[利用者エージェント]]は提示された[[誰何]]のうち対応している最も「安全」な方法を選択する[RUBYB[べき]@en[ought to]]
[SRC[>>6]] / 最も強い方法を選択しなければ[['''なりません''']] [SRC[>>34]]
/ 選択する[['''べきです''']] [SRC[>>35]]。

[36] [[MITM攻撃]]により不正な[[プロキシ]]が[[ダイジェスト認証]]を[[基本認証]]に差し替えるような形で[[合言葉]]を奪取しようとするかもしれません
[SRC[>>35]]。より安全でない[[認証方式]]に途中で変わらないか検査したり、
[[認証方式]]を[[利用者]]に提示したりする配慮が必要かもしれません [SRC[>>35]]。

[HISTORY[
[14] [[RFC 2068]] では、[[利用者エージェント]]は、対応しているより最初のものを使うべき、
かつ最も安全な方法を選択するべき [SRC[>>10]]、と2つの矛盾する方針を同時に勧められていました。
[[RFC 2617]] では >>12 だけを要求しており、しかもおすすめではなく、
[['''必須''']] [SRC[>>16]] となっていました。 [[RFC 7235]] では [[ought to]]
になっています。
]HISTORY]

;; [5] [[RFC 7235]] は、多くの[[クライアント]]で未知の [CODE(ABNF)@en[[[auth-scheme]]]]
が含まれている時構文解析に失敗するため、最初に [CODE(HTTP)@en[[[Basic]]]]
のような広く対応されている方式を指定して対処できると指摘しています。 [SRC[>>6]]

[32] [[ダイジェスト認証]]は複数の[[ダイジェストアルゴリズム]]に対応できる仕組みとなっています。
[CODE(HTTP)@en[[[WWW-Authenticate:]]]] [[ヘッダー]]には [CODE(ABNF)@en[[[auth-scheme]]]]
が [CODE(HTTP)@en[[[Digest]]]] の [[challenge]] を複数指定できます。
その場合、[[ダイジェストアルゴリズム]] ([CODE(HTTP)@en[[[algorithm]]]])
は、すべて異なるものでなければ[['''なりません''']] [SRC[>>31]]。
順序は、優先度順としなければ[['''なりません''']] [SRC[>>31]]。

[33] [[クライアント]]は、複数の [CODE(HTTP)@en[[[Digest]]]] [[challenge]]
を受信したら、特に希望がなければ、最初の [[challenge]]
を採用する[['''べきです''']] [SRC[>>31]]。

* authentication challenge

[18] [[RFC 7231]] では次の[[ヘッダー]]が [DFN[[[authentication challenge]]]]
に分類されています [SRC[>>17]]。
[FIG(short list)[
- [CODE(HTTP)@en[[[WWW-Authenticate:]]]]
- [CODE(HTTP)@en[[[Proxy-Authenticate:]]]]
]FIG]

[37] それ以外で [CODE(HTTP)@en[Optional-WWW-Authenticate:]] でも
[[challenge]] が使われます。

* [CODE(HTTP)@en[WWW-Authenticate: OAuth]] の challenge

[25] [[OAuth 1.0]] の[[鯖]]は、[[保護資源]]に対する[[応答]]に
[CODE(HTTP)@en[[[WWW-Authenticate:]] [[OAuth]]]] [[ヘッダー]]を含めて
[[OAuth 1.0]] への対応を示すことができます [SRC[>>24]]。

[26] [CODE(HTTP)@en[[[realm]]]] [[引数]]は、 [[HTTP認証]]一般で規定されている通りの意味を持ちます
[SRC[>>24]]。

;; [27] [[OAuth]] は[[基本認証]]や[[ダイジェスト認証]]のように [[challenge]]
に対して [[credentials]] を送信する形で利用するのは一般的ではないので、
[[challenge]] の必要性は低く、実際に使われることはそう多くは無いようです。

* レンダリング

[29] [CODE(HTTP)[[[401]]]] [[応答]]の[[レンダリング]]については、
[CODE(HTTP)[[[401]]]] の項を参照。

[30] [[利用者エージェント]]は、それ以外の[[応答]]であっても、
[[challenge]] が含まれていれば (非[[モーダルダイアログ]]により)
[[利用者]]が[[認証]]できるようにする[['''べきです''']] [SRC[>>28]]。

* 歴史

** 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[
- [9] [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>
- [10] [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-15.2>
]REFS]

** RFC 第3世代 (RFC 2617)

[REFS[
- [15] '''[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>'''
- [16] [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-4.6>
]REFS]

** RFC 第4世代 (RFC 7235)

[REFS[
- [19] '''[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]

* 関連

[7] [[認証]]情報を[[クライアント]]から[[鯖]]に送信する際には [[credentials]]
を使います。 [[challenge]] と [[credentials]] は一般的な構文としては同じですが、
[CODE(ABNF)@en[[[auth-scheme]]]] 依存の構文としては違うことがあります。