/
433.txt
226 lines (169 loc) · 12.3 KB
/
433.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
[7] [[誰何]]や [[credentials]] における[[引数]]は [DFN[[CODE(ABNF)[[[auth-param]]]]]] [SRC[>>3]]
や [DFN[[[authentication parameter]]]] [SRC[>>3]] と呼ばれています。
* 仕様書
[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>
]REFS]
* 構文
[5] [CODE(ABNF)@en[[[auth-param]]]] は、名前と値の組を [CODE[[[=]]]]
で連結したものです。 [CODE[[[=]]]] の前後には [[BWS]] が挟まります。 [SRC[>>3]]
[33] 名前は[[字句]]です。[[大文字・小文字不区別]]です。 [SRC[>>3]]
;; [14] [[RFC 1945]] / [[RFC 2068]] は [CODE(HTTP)@en[[[realm]]]] [[属性]]以外について[[大文字]]と[[小文字]]の解釈を明記していませんでした。
[63] 値は[[字句]]または[[引用文字列]]です。 [SRC[>>3]]
[FIG(railroad)[
= [[字句]]
= [CODE[[[=]]]]
= |
== [[字句]]
== [[引用文字列]]
]FIG]
;; [34] [[引数]]も参照。
;; [2] [[RFC 1945]] と [[RFC 2068]] では値は[[引用文字列]]とされていました。
[[RFC 2617]] 以後[[字句]]も認められています。
;; [22] [[RFC 1945]] と [[RFC 2068]] の定義では必ず[[引用文字列]]とすることになっていましたが、
[[RFC 2069]] ではそうなっていない構文が定義されており、矛盾していました。
[36] 更に、各[[引数]]について個別の値の構文が定義されています。
;; [68] [[RFC 2616]] 世代までは、例によって[[引数]]ごとの個別の [[ABNF]]
構文は [[quoted-string]] の[[引用符]]まで含めて特定の構文を決める形になっていました。
現実にはまず [[token]] または [[quoted-string]] として構文解析した後にその値の部分を取り出して処理するのが一般的だと思われます。 [[RFC 723x]] 世代からはそのような形に改められています。
[[RFC 7235]] もそのように定義することを[RUBYB[求めて]@en[ought to]]います [SRC[>>67]]。
[69] [CODE(HTTP)@en[[[realm]]]] [[引数]]の値は[[字句]]ではなく[[引用文字列]]としなければならないとされています。ただしこのような制限は新しい[[引数]]には設ける[RUBYB[べきではない]@en[ought to]]とされています
[SRC[>>67]]。
** 文字コード
[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)。
[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]] 構文の定義上のものなのか、
現実にそうでなければならない要件なのかははっきりしませんでした。
* 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]]]]
に続けて指定し、[[認証]]に必要な情報を表します。
* 未知の引数
[70] 未知の[[引数]]についての共通の処理の方法はありません。
[[認証方式]]を定義する際はどのように扱うか決める[RUBYB[べき]@en[ought to]]とされています
[SRC[>>67]]。その際、「理解しなければならない」ではなく「無視しなければならない」
とするのが[RUBYB[好ましい]@en[prefer]]とされています [SRC[>>67]]。
また新しい[[引数]]を規定する方法 ([[仕様書]]の改訂や登録簿など) も定める[RUBYB[べき]@en[ought to]]とされています
[SRC[>>67]]。
[38] [[Digest認証]]では未知の[[引数]]は無視し[['''なければなりません''']] [SRC[>>39, >>42]]。
* 引数の一覧
[FIG(list)[
- [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]])
- [58] [CODE(HTTP)@en[[[auth]]]] ([[GoogleLogin]] [[credentials]])
- [40] [CODE(HTTP)@en[[[cnonce]]]] ([[Digest]] [[credentials]])
- [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]])
- [41] [CODE(HTTP)@en[[[nc]]]] ([[Digest]] [[credentials]])
- [24] [CODE(HTTP)@en[[[nonce]]]] ([[Digest]] [[誰何]])
- [43] [CODE(HTTP)@en[[[oauth_consumer_key]]]] ([[OAuth]] [[credentials]])
- [48] [CODE(HTTP)@en[[[oauth_nonce]]]] ([[OAuth]] [[credentials]])
- [57] [CODE(HTTP)@en[[[oauth_problem]]]] ([[OAuth]] [[誰何]])
- [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]])
- [49] [CODE(HTTP)@en[[[oauth_version]]]] ([[OAuth]] [[credentials]])
- [25] [CODE(HTTP)@en[[[opaque]]]] ([[Digest]] [[誰何]], [[credentials]])
- [37] [CODE(HTTP)@en[[[qop]]]] ([[Digest]] [[誰何]], [[credentials]])
- [30] [CODE(HTTP)@en[[[response]]]] ([[Digest]] [[credentials]])
- [CODE(HTTP)@en[[[scope]]]] ([CODE(HTTP)@en[[[Bearer]]]] [[challenge]])
- [26] [CODE(HTTP)@en[[[stale]]]] ([[Digest]] [[誰何]])
- [10] [CODE(HTTP)@en[[[realm]]]] ([[誰何]])
- [29] [CODE(HTTP)@en[[[uri]]]] ([[Digest]] [[credentials]])
- [28] [CODE(HTTP)@en[[[username]]]] ([[Digest]] [[credentials]])
]FIG]
;; [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]]]] の部分に含まれています。
[74] >>73 に [[SIP]] に関する [[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>
]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]
* 歴史
** 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]