-
Notifications
You must be signed in to change notification settings - Fork 4
/
471.txt
250 lines (202 loc) · 16.8 KB
/
471.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
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
* 仕様書
[REFS[
- [7] [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-2.3>
- [34] [CITE@en[RFC 6749 - The OAuth 2.0 Authorization Framework]] ([TIME[2014-12-15 14:15:35 +09:00]] 版) <http://tools.ietf.org/html/rfc6749#section-3.2>
- [52] [CITE@en[RFC 6749 - The OAuth 2.0 Authorization Framework]] ([TIME[2014-12-15 14:15:35 +09:00]] 版) <http://tools.ietf.org/html/rfc6749#section-4.1.3>
- [55] [CITE@en[RFC 6749 - The OAuth 2.0 Authorization Framework]] ([TIME[2014-12-15 14:15:35 +09:00]] 版) <http://tools.ietf.org/html/rfc6749#section-4.1.4>
- [58] [CITE@en[RFC 6749 - The OAuth 2.0 Authorization Framework]] ([TIME[2014-12-15 14:15:35 +09:00]] 版) <http://tools.ietf.org/html/rfc6749#section-4.2.2>
- [61] [CITE@en[RFC 6749 - The OAuth 2.0 Authorization Framework]] ([TIME[2014-12-15 14:15:35 +09:00]] 版) <http://tools.ietf.org/html/rfc6749#section-4.3.2>
- [64] [CITE@en[RFC 6749 - The OAuth 2.0 Authorization Framework]] ([TIME[2014-12-15 14:15:35 +09:00]] 版) <http://tools.ietf.org/html/rfc6749#section-4.3.3>
- [65] [CITE@en[RFC 6749 - The OAuth 2.0 Authorization Framework]] ([TIME[2014-12-15 14:15:35 +09:00]] 版) <http://tools.ietf.org/html/rfc6749#section-4.4.2>
- [67] [CITE@en[RFC 6749 - The OAuth 2.0 Authorization Framework]] ([TIME[2014-12-15 14:15:35 +09:00]] 版) <http://tools.ietf.org/html/rfc6749#section-4.4.3>
- [68] [CITE@en[RFC 6749 - The OAuth 2.0 Authorization Framework]] ([TIME[2014-12-15 14:15:35 +09:00]] 版) <http://tools.ietf.org/html/rfc6749#section-4.5>
- [71] [CITE@en[RFC 6749 - The OAuth 2.0 Authorization Framework]] ([TIME[2014-12-15 14:15:35 +09:00]] 版) <http://tools.ietf.org/html/rfc6749#section-5.1>
- [87] [CITE@en[RFC 6749 - The OAuth 2.0 Authorization Framework]] ([TIME[2014-12-15 14:15:35 +09:00]] 版) <http://tools.ietf.org/html/rfc6749#section-5.2>
]REFS]
* OAuth 1.0 トークン要求
[8] [[クライアント]]は、[[資源所有者認可]]の後、
[DFN[[RUBYB[[[トークン要求]]]@en[token request]]]]により[[トークンcredentials]]を[[鯖]]から得ることができます。
[9] [[トークン要求]]は、[[クライアントcredentials]]と
([[トークンcredentials]]のかわりに) [[一時credentials]]を使って[[認証された要求]]です
[SRC[>>7]]。
;; [CODE(URI)@en[[[oauth_token]]]] は[[一時credentials]] の[[識別子]]となります。
[10] [[トークン要求]]は、原則として[[要求メソッド]] [CODE(HTTP)@en[[[POST]]]]
を使います [SRC[>>7]]。[[鯖]]が何らかの方法で他の[[要求メソッド]]を[[広告]]した場合には、
そちらを使うこともできます [SRC[>>7]]。
[11] [[トークン要求]]は、[[鯖]]が何らかの方法で[[広告]]した[[トークン要求]]の[[エンドポイント]]を[[要求URL]]として使います [SRC[>>7]]。
[13] [[鯖]]は、[[トークン要求]]で[[保安輸送路]]を使わなければ[['''なりません''']]
[SRC[>>7]]。
[12] [[クライアント]]は、[[資源所有者認可]]の結果得られた[[検証符号]]
(を[[資源所有者]]経由で知ったもの) を [CODE(URI)@en[[[oauth_verifier]]]]
[[引数]]に指定しなければ[['''なりません''']] [SRC[>>7]]。
[14] [[鯖]]は、[[トークン要求]]を受信したら次の点を確認しなければ[['''なりません''']]
[SRC[>>7]]。
[FIG(list)[
- [15] [[要求]]が妥当であるか[[検証]]する
- [16] [[資源所有者]]が[[クライアント]]に[[トークンcredentials]]を与えることを[[認可]]していることを確認する
- [17] [[一時credentials]]が[[満期]]となっておらず、使用済みでもないか確認する
- [18] [[検証符号]]が正しいものか確認する
]FIG]
[19] 確認できたなら、[[状態符号]] [CODE(HTTP)[[[200]]]]、
[[MIME型]] [CODE(MIME)@en[[[application/x-www-form-urlencoded]]]]
の [[payload body]] の[[応答]]とします [SRC[>>7]]。
[20] [[payload body]] には[[引数]] [CODE(URI)@en[[[oauth_token]]]]
として[[トークン識別子]]を、 [CODE(URI)@en[[[oauth_token_secret]]]]
として[[トークン共有秘密]]をを含めなければ[['''なりません''']] [SRC[>>7]]。
* OAuth 2.0 トークンエンドポイント
[35] [[認可鯖]]の[DFN[[RUBYB[[[トークンエンドポイント]]]@en[token endpoint]]]]は、
[[クライアント]]が[[認可承諾]]や[[更新トークン]]を使って[[アクセストークン]]を得るために使うものです。
[[トークンエンドポイント]]は、
[[暗示的承諾型]]以外の[[承諾型]] ([[認可符号]]、[[資源所有者合言葉credentials]]、
[[クライアントcredentials]]) で使います。 [SRC[>>34]]
** トークンエンドポイントへの要求
[36] [[クライアント]]が[[トークンエンドポイント]]の位置を知る方法は [[OAuth]]
の仕様の範囲外とされていますが、普通は[[サービス]]の[[ドキュメント]]で示されます [SRC[>>34]]。
[38] [[トークンエンドポイント]]は [[TLS]] を使わなければ[['''なりません''']] [SRC[>>34]]。
[37] [[トークンエンドポイント]]の [[URL]] は
[CODE(MIME)@en[[[application/x-www-form-urlencoded]]]] 形式の [[query]]
を含んでも構いません。[[素片識別子]]を含んでは[['''なりません''']]。
[[query]] が含まれる場合、[[引数]]を追加するときにはそのまま残さなければ[['''なりません''']]。
[SRC[>>34]]
[48] [[クライアント]]は、[[認可符号]]から[[アクセストークン]]を得るために[[トークンエンドポイント]]に[[要求]]を送信する場合、
[CODE(MIME)@en[[[application/x-www-form-urlencoded]]]] [[payload body]]
により次の[[引数]]を指定します [SRC[>>52]]。
[FIG(list members)[
[FIGCAPTION[
[[payload body]] ([CODE(MIME)@en[[[application/x-www-form-urlencoded]]]])
]FIGCAPTION]
:[CODE(URI)@en[[[grant_type]]]]:[CODE(URI)@en[[[authorization_code]]]]
でなければ[['''なりません''']] [SRC[>>52]]。
:[CODE(URI)@en[[[code]]]]:受信した[[認可符号]]を指定しなければ[['''なりません''']] [SRC[>>52]]。
:[CODE(URI)@en[[[redirect_uri]]]]:[[認可エンドポイント]]への要求で
[CODE(URI)@en[[[redirect_uri]]]] [[引数]]を指定した場合は、同じ値を指定しなければ[['''なりません''']]
[SRC[>>52]]。
:[CODE(URI)@en[[[client_id]]]]:[[クライアント認証]]しない場合は指定しなければ[['''なりません''']] [SRC[>>52, >>34]]。
]FIG]
[50] [[クライアント]]は、[[資源所有者]]の [[credentials]] から[[アクセストークン]]を得るため
([[資源所有者合言葉credentials]]フロー) に[[トークンエンドポイント]]に[[要求]]を送信する場合、
[CODE(MIME)@en[[[application/x-www-form-urlencoded]]]] [[payload body]]
により次の[[引数]]を指定します [SRC[>>61]]。
[FIG(list members)[
[FIGCAPTION[
[[payload body]] ([CODE(MIME)@en[[[application/x-www-form-urlencoded]]]])
]FIGCAPTION]
:[CODE(URI)@en[[[grant_type]]]]:[CODE(URI)@en[[[password]]]]
でなければ[['''なりません''']] [SRC[>>61]]。
:[CODE(URI)@en[[[username]]]]:[[資源所有者]]の[[利用者名]]を指定しなければ[['''なりません''']] [SRC[>>61]]。
:[CODE(URI)@en[[[password]]]]:[[資源所有者]]の[[合言葉]]を指定しなければ[['''なりません''']]
[SRC[>>61]]。
:[CODE(URI)@en[[[scope]]]]:アクセス要求の[[適用範囲]]を指定できます [SRC[>>61]]。
]FIG]
[66] [[クライアント]]は、[[クライアントcredentials]] から[[アクセストークン]]を得るため
([[クライアントcredentials]]フロー) に[[トークンエンドポイント]]に[[要求]]を送信する場合、
[CODE(MIME)@en[[[application/x-www-form-urlencoded]]]] [[payload body]]
により次の[[引数]]を指定します [SRC[>>65]]。
[FIG(list members)[
[FIGCAPTION[
[[payload body]] ([CODE(MIME)@en[[[application/x-www-form-urlencoded]]]])
]FIGCAPTION]
:[CODE(URI)@en[[[grant_type]]]]:[CODE(URI)@en[[[client_credentials]]]]
でなければ[['''なりません''']] [SRC[>>65]]。
:[CODE(URI)@en[[[scope]]]]:アクセス要求の[[適用範囲]]を指定できます [SRC[>>65]]。
]FIG]
[69] [[クライアント]]は、拡張の[[承諾型]]の規定に従い[[トークンエンドポイント]]に[[要求]]を送信する場合、
[CODE(URI)@en[[[grant_type]]]] [[引数]]に[[絶対URL]]を指定し、
必要に応じて追加の[[引数]]も指定します [SRC[>>68]]。
;; [70] 例えば [[SAML 2.0]] が拡張の[[承諾型]]を規定しています。
[41] [[要求]]の[[引数]]は、複数指定しては[['''なりません''']] [SRC[>>34]]。
[39] [[クライアント]]は[[トークンエンドポイント]]への[[要求]]で [CODE(HTTP)@en[[[POST]]]]
[[要求メソッド]]を使わなければ[['''なりません''']] [SRC[>>34]]。
[43] [[クライアント型]]が[[機密]]の[[クライアント]]と、
[[クライアントcredentials]]を発行された[[クライアント]]は、
[[トークンエンドポイント]]への[[要求]]で[[クライアント認証]]を行わなければ[['''なりません''']]
[SRC[>>34, >>52, >>61, >>65]]。
[49] [[クライアント]]は、(以上に該当しなくても)
[[トークンエンドポイント]]への[[要求]]で自身を識別する
[CODE(URI)@en[[[client_id]]]] [[引数]]を使っても構いません [SRC[>>34]]。
** トークンエンドポイントの処理
[82] [[認可鯖]]は >>43 の場合に[[クライアント認証]]を必須としなければ[['''なりません''']] [SRC[>>52, >>61, >>65]]。
[[認可鯖]]は[[クライアント認証]]が含まれていれば、[[認証]]しなければ[['''なりません''']]
[SRC[>>52, >>61, >>65]]。
;; [44] [[認可鯖]]は[[クライアント認証]]を次の目的で使います [SRC[>>34]]。
[FIG(list)[
- [45] [[更新トークン]]や[[認可符号]]とその発行先の[[クライアント]]との紐付け。
[[認可符号]]を安全でない[[通信路]]で[[リダイレクトエンドポイント]]に送る時や[[リダイレクトURL]]
が完全に登録されていない時には特に重要です。
- [46] [[クライアント]]を無効化したり、[[credentials]] を変更したりして、
[[更新トークン]]が漏洩した時に濫用を防止。[[更新トークン]]をすべて変更するよりはこちらの方が容易です。
- [47] [[credentials]] の定期的な[RUBYB[入れ替え]@en[rotation]]を含む[[認証]]管理で良いとされている慣習の実行。
[[更新トークン]]をすべて入れ替えるのは大変ですが、[[クライアントcredentials]]一式だけならずっと容易です。
]FIG]
[83] [[認可鯖]]は、認識できない[[引数]]を無視しなければ[['''なりません''']] [SRC[>>34]]。
[40] [[要求]]の[[引数]]に値が含まれなければ、指定されなかったものと扱わなければ[['''なりません''']] [SRC[>>34]]。
;; [CODE(MIME)@en[[[application/x-www-form-urlencoded]]]] で [CODE[[[=]]]]
が含まれない場合を指しているのでしょうか? [[空文字列]]が指定された場合と区別する必要があるということでしょうか??
[54] [[認可鯖]]は、[[認可符号]]から[[アクセストークン]]の発行を求められている場合、
[[認可符号]]が妥当なものであることを確認しなければ[['''なりません''']] [SRC[>>52]]。
[[認可符号]]は1回しか使えません。
[53] [[認可鯖]]は、[[認可符号]]から[[アクセストークン]]の発行を求められている場合、
[[クライアント型]]が[[機密]]の[[クライアント]]に対するものであるか、
[[クライアント型]]が[[公開]]の[[クライアント]]に対するもので[[認可符号]]の発行先と
[CODE(URI)@en[[[client_id]]]] が合致していることを確認しなくては[['''なりません''']] [SRC[>>52]]。
[54] [[認可鯖]]は、[[認可符号]]から[[アクセストークン]]の発行を求められている場合、
[[認可エンドポイント]]へのアクセス時に [CODE(URI)@en[[[redirect_uri]]]]
[[引数]]が指定されていたなら本要求にも [CODE(URI)@en[[[redirect_uri]]]]
[[引数]]が含まれており、両者の値が一致することを確認しなければ[['''なりません''']]
[SRC[>>52]]。
[62] [[認可鯖]]は、[[資源所有者]]の [[credentials]] から[[アクセストークン]]の発行を求められている場合、
指定された [[credentials]] を検証しなければ[['''なりません''']] [SRC[>>52]]。
[63] [[認可鯖]]は、回数制限や警告などにより、[[資源所有者合言葉credentials]]
の[[総当たり攻撃]]から[[エンドポイント]]を保護しなければ[['''なりません''']] [SRC[>>52]]。
** トークンエンドポイントの応答
[56] [[認可鯖]]は、[[アクセストークン]]の発行を求められている場合、
要求が妥当であり[[認可]]されたなら、[[アクセストークン]]を発行します
[SRC[>>55, >>64, >>67, >>68]]。
[[認可符号]]や[[資源所有者合言葉credentials]]、拡張の[[承諾型]]では、
[[更新トークン]]も発行することもできます [SRC[>>55, >>64, >>68]]。
[[クライアントcredentials]]では、
[[更新トークン]]を発行する[['''べきではありません''']] [SRC[>>67]]。
[72] その場合には、 [CODE(HTTP)[[[200]]]] [[応答]]で次の[[引数]]を
[[JSON]] ([CODE(MIME)@en[[[application/json]]]]) [[payload body]] の
[[JSONオブジェクト]]の名前と値 ([[文字列]]なら [[JSON文字列]]、
[[数値]]なら [[JSON数値]]) に含めます [SRC[>>71]]。
[FIG(list members)[
[FIGCAPTION[
[[JSONオブジェクト]]
]FIGCAPTION]
:[73] [CODE(HTTP)@en[[[access_token]]]]:[[認可鯖]]が発行した[[アクセストークン]]を指定しなければ[['''なりません''']] [SRC[>>71]]。
:[74] [CODE(HTTP)@en[[[token_type]]]]:発行した[[トークン]]の種類を指定しなければ[['''なりません''']]
[SRC[>>71]]。
:[75] [CODE(HTTP)@en[[[expires_in]]]]:[[アクセストークン]]の[[寿命]]を[[秒]]単位で指定する[['''べきです''']] [SRC[>>71]]。
:[76] [CODE(HTTP)@en[[[refresh_token]]]]:同じ[[認可承諾]]を使って新しい[[アクセストークン]]を得られる[[更新トークン]]を指定できます [SRC[>>71]]。
:[77] [CODE(HTTP)@en[[[scope]]]]:[[クライアント]]が要求した[[適用範囲]]と[[アクセストークン]]の[[適用範囲]]が異なるなら、指定しなければ[['''なりません''']]。同じ場合も指定できます。 [SRC[>>71]]
]FIG]
;; [78] どれが文字列でどれが数値かは明確ではありませんが、
[CODE(HTTP)@en[[[expires_in]]]] は[[数値]]、それ以外は[[文字列]]と思われます。
[42] [[応答]]の[[引数]]は、複数指定しては[['''なりません''']] [SRC[>>34]]。
[79] 更に、 [CODE(HTTP)@en[[[Cache-Control:]] [[no-store]]]] と
[CODE(HTTP)@en[[[Pragma:]] [[no-cache]]]] を含めなければ[['''なりません''']] [SRC[>>71]]。
[80] [[クライアント]]は、認識できない名前の[[引数]]を無視しなければ[['''なりません''']]
[SRC[>>71]]。
[56] [[認可鯖]]は、[[アクセストークン]]の発行を求められている場合、
[[クライアント認証]]に失敗したか要求が非妥当であったなら、
誤り応答を返します [SRC[>>55, >>64, >>67, >>68]]。
[88] その場合には、 [CODE(HTTP)[[[200]]]] [[応答]]で次の[[引数]]を
[[JSON]] ([CODE(MIME)@en[[[application/json]]]]) [[payload body]] の
[[JSONオブジェクト]]の名前と値 ([[文字列]]なら [[JSON文字列]]、
[[数値]]なら [[JSON数値]]) に含めます [SRC[>>87]]。
[FIG(list members)[
[FIGCAPTION[
[[JSONオブジェクト]]
]FIGCAPTION]
:[84] [CODE(URI)@en[[[error]]]]:[[誤り符号]]を指定しなければ[['''なりません''']] [SRC[>>87]]。
:[85] [CODE(URI)@en[[[error_description]]]]:[[人間可読]]な[[誤り]]の説明を指定して構いません
[SRC[>>87]]。
:[86] [CODE(URI)@en[[[error_uri]]]]:[[人間可読]]な[[誤り]]の説明を含む[[Webページ]]の [[URL]]
を指定して構いません [SRC[>>87]]。
]FIG]
[51] [CODE(URI)@en[[[error]]]] が [CODE@en[[[invalid_client]]]] の場合には、
[CODE(HTTP)[[[401]]]] [[応答]]とすることもできます。
[[クライアント]]が [CODE(HTTP)@en[[[Authorization:]]]] [[ヘッダー]]で[[認証]]を試みた場合には、
[CODE(HTTP)[[[401]]]] [[応答]]と [CODE(HTTP)@en[[[WWW-Authenticate:]]]]
[[ヘッダー]] ([[auth-scheme]] は[[要求]]で指定されたもの) を使って[[応答]]しなければ[['''なりません''']] [SRC[>>87]]。