-
Notifications
You must be signed in to change notification settings - Fork 4
/
471.txt
363 lines (288 loc) · 25.5 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
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
* 仕様書
[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>
- [1] [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-6>
- [21] [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-9>
- [89] [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-10>
]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]
[2] [[クライアント]]は、[[更新トークン]] から[[アクセストークン]]を得るために[[トークンエンドポイント]]に[[要求]]を送信する場合、
[CODE(MIME)@en[[[application/x-www-form-urlencoded]]]] [[payload body]]
により次の[[引数]]を指定します [SRC[>>1]]。
[FIG(list members)[
[FIGCAPTION[
[[payload body]] ([CODE(MIME)@en[[[application/x-www-form-urlencoded]]]])
]FIGCAPTION]
:[CODE(URI)@en[[[grant_type]]]]:[CODE(URI)@en[[[refresh_token]]]]
でなければ[['''なりません''']] [SRC[>>1]]。
:[CODE(URI)@en[[[refresh_token]]]]:[[クライアント]]に発行されている[[更新トークン]]を指定しなければ[['''なりません''']] [SRC[>>1]]。
:[CODE(URI)@en[[[scope]]]]:アクセス要求の[[適用範囲]]を指定できます [SRC[>>1]]。
元々[[資源所有者]]に[[承諾]]された[[適用範囲]]以外を指定しては[['''なりません''']] [SRC[>>1]]。
省略すると、元々[[資源所有者]]に[[承諾]]された[[適用範囲]]を表します [SRC[>>1]]。
]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, >>1]]。
ただし[[ネイティブアプリケーション]]は、
[[認可符号]]フローにおいて[[クライアント]]の [[credentials]]
を送信する[['''べきではありません''']] [SRC[>>21]]。
[49] [[クライアント]]は、(以上に該当しなくても)
[[トークンエンドポイント]]への[[要求]]で自身を識別する
[CODE(URI)@en[[[client_id]]]] [[引数]]を使っても構いません [SRC[>>34]]。
;; この場合は [[credentials]] は指定しないので、[[クライアント認証]]は行われません。
[82] [[認可鯖]]は、[[クライアント型]]が[[機密]]の[[クライアント]]や[[クライアントcredentials]]
を発行した[[クライアント]]に関しては、
[[トークンエンドポイント]]における [[OAuth 2.0]] の各[[承諾型]]の要求において、
[[クライアント認証]]を必須としなければ[['''なりません''']] [SRC[>>52, >>61, >>65, >>1, >>89]]。
[22] [[認可鯖]]は、[[クライアント型]]が[[機密]]の[[クライアント]]については、
自身の要件次第で任意の[[認証]]方式を使って[[認証]]して構いません [SRC[>>7]]。
[[認可鯖]]は、[[クライアント型]]が[[公開]]の[[クライアント]]についても[[認証]]して構いませんが、
[[クライアント]]の識別のためにこれに依存しては[['''なりません''']] [SRC[>>7]]。
;; [24] 一般的には[[合言葉]]や、[[公開鍵]]と[[秘密鍵]]の組のようなものを[[認可鯖]]が発行または登録して使います [SRC[>>7]]。[[クライアントの登録]]も参照。
[25] [[認可鯖]]は、
[[トークンエンドポイント]]における [[OAuth 2.0]] の各[[承諾型]]の要求に[[クライアント認証]]が含まれていれば、[[認証]]しなければ[['''なりません''']]
[SRC[>>52, >>61, >>65, >>1]]。
;; [23] [[OAuth 2.0クライアント認証]]は[[クライアント]]と[[認可鯖]]の間の任意の[[エンドポイント]]で利用可能な形で規定されてはいますが、実際に利用されるのは[[トークンエンドポイント]]でのみです。
[26] 複数の[[認証]]方法を単独の[[要求]]で併用しては[['''なりません''']] [SRC[>>7]]。
[27] [[認可鯖]]は、[[合言葉]]で[[認証]]する時は、 [[TLS]] を要求しなければ[['''なりません''']]
[SRC[>>7]]。また[[総当たり攻撃]]に対して[[エンドポイント]]を保護しなければ[['''なりません''']]
[SRC[>>7]]。
[28] [RUBYB[[[合言葉]]]@en[password]]を使う場合、[[基本認証]]を使って構いません。
[[クライアント]]に[[合言葉]]を発行した[[認可鯖]]は、[[基本認証]]に対応しなければ[['''なりません''']]。
[SRC[>>7]]
[29] [[基本認証]]を使う場合、[[利用者名]]は[[クライアント識別子]]を [[UTF-8]] で
[CODE(MIME)@en[[[application/x-www-form-urlencoded]]]] [[符号化]]したもの、
[[合言葉]]は[[クライアント]]の[[合言葉]]を [[UTF-8]] で
[CODE(MIME)@en[[[application/x-www-form-urlencoded]]]] [[符号化]]したものとします。
[SRC[>>7]]
;; [30] 入力が名前と値の組でないわけですが、
[CODE(MIME)@en[[[application/x-www-form-urlencoded]]]]
版[[パーセント符号化]]を使うという意味だと思われます。
[31] なぜか[[認可鯖]]側の解釈の方法は規定されていません。
;; [32] どの[[文字]]が[[パーセント符号化]]されるのか [[RFC]] および参照先の [[HTML4]]
では曖昧なので、[[鯖]]は一旦[[復号]]してから比較する必要がありそうです。
[33] [[認可鯖]]は、 [[payload body]] に[[引数]]を指定する方式に対応しても構いません。
しかし[[クライアント]]は[[基本認証]]を使えない場合のみこの方法を使う[['''べきです''']]。
[[payload body]] でなく[[要求URL]]中で指定しては[['''なりません''']]。 [SRC[>>7]]
[59] その場合、[[クライアント]]は [CODE(URI)@en[[[client_id]]]] [[引数]]に[[クライアント識別子]]を、
[CODE(URI)@en[[[client_secret]]]] [[引数]]に[RUBYB[クライアント秘密]@en[client secret]]を指定しなければ[['''なりません''']]。
ただし[[クライアント秘密]]が[[空文字列]]なら、 [CODE(URI)@en[[[client_secret]]]]
[[引数]]は省略できます。 [SRC[>>7]]
;; [57] [CODE(MIME)@en[[[application/x-www-form-urlencoded]]]] の例が示されています [SRC[>>7]]
が、その他の方式でも良いのか不明です。
[60] [[認可鯖]]は他の[[HTTP認証]]方式に対応しても構いませんが、
[[クライアント識別子]]と当該認証方式との対応関係を定義しなければ[['''なりません''']]
[SRC[>>7]]。
[90] [[認可鯖]]は、[[Webアプリケーション]]たる[[クライアント]]に関して[[合言葉]]よりも強い[[認証]]手段を検討することが[RUBYB[推奨]@en[encourage]]されています。
[[Webアプリケーション]]は[[合言葉]]その他の [[credentials]] の[[機密]]性を維持しなければ[['''なりません''']]。 [SRC[>>89]]
[81] [[認可鯖]]は、[[ネイティブアプリケーション]]や[[利用者エージェントベースのアプリケーション]]である[[クライアント]]に[[クライアント認証]]用の[[合言葉]]その他の
[[credentials]] を発行しては[['''なりません''']]。ただし[[ネイティブアプリケーション]]を特定の[[装置]]上で動作させたものに対しては[[合言葉]]その他の [[credentials]]
を発行しても構いません。 [SRC[>>89]]
[91] [[認可鯖]]は、[[クライアント認証]]が不可能な時に、
[[クライアント]]の [[identity]] を[RUBYB[検証]@en[validate]]する他の手段を用いる[['''べき''']]です。
例えば、[[リダイレクトURL]]を登録させたり、[[資源所有者]]に協力させたりできます。
[[認可鯖]]は、性質上[[認証]]できない[[クライアント]]については[[リダイレクトURL]]
の登録を求めなければ[['''なりません''']]。それ以外でも不正な[[クライアント]]から[[資源所有者]]を保護する方策をとる[['''べきです''']]。
[[リダイレクトURL]]が正しいからといって[[クライアント]]の [[identity]]
の検証には不十分ではありますが、 [[credentials]] を不正な[[クライアント]]に渡してしまうことは防止できます。 [SRC[>>89]]
[92] [[認可鯖]]は認証していない[[クライアント]]とのやりとりの[[セキュリティー]]を勘案し、
[[更新トークン]]など他の [[credentials]] を渡さないなど注意しなければなりません [SRC[>>89]]。
;; [44] [[認可鯖]]は[[クライアント認証]]を次の目的で使います [SRC[>>34]]。
[FIG(list)[
- [45] [[更新トークン]]や[[認可符号]]とその発行先の[[クライアント]]との紐付け。
[[認可符号]]を安全でない[[通信路]]で[[リダイレクトエンドポイント]]に送る時や[[リダイレクトURL]]
が完全に登録されていない時には特に重要です。
- [46] [[クライアント]]を無効化したり、[[credentials]] を変更したりして、
[[更新トークン]]が漏洩した時に濫用を防止。[[更新トークン]]をすべて変更するよりはこちらの方が容易です。
- [47] [[credentials]] の定期的な[RUBYB[入れ替え]@en[rotation]]を含む[[認証]]管理で良いとされている慣習の実行。
[[更新トークン]]をすべて入れ替えるのは大変ですが、[[クライアントcredentials]]一式だけならずっと容易です。
]FIG]
;; [93] [[認可エンドポイント]]も参照。
** トークンエンドポイントの処理
[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]]。
[3] [[認可鯖]]は、[[更新トークン]]から[[アクセストークン]]の発行を求められている場合、
指定された[[更新トークン]]を検証しなければ[['''なりません''']] [SRC[>>1]]。
[63] [[認可鯖]]は、回数制限や警告などにより、[[資源所有者合言葉credentials]]
の[[総当たり攻撃]]から[[エンドポイント]]を保護しなければ[['''なりません''']] [SRC[>>52]]。
** トークンエンドポイントの応答
[56] [[認可鯖]]は、[[アクセストークン]]の発行を求められている場合、
要求が妥当であり[[認可]]されたなら、[[アクセストークン]]を発行します
[SRC[>>55, >>64, >>67, >>68, >>1]]。
[4] [[認可符号]]や[[資源所有者合言葉credentials]]、拡張の[[承諾型]]では、
[[更新トークン]]も発行することもできます [SRC[>>55, >>64, >>68]]。
ただし[[クライアント認証]]していない場合には発行するべきではないかもしれません [SRC[>>89]]。
[5] [[クライアントcredentials]]では、
[[更新トークン]]を発行する[['''べきではありません''']] [SRC[>>67]]。
[6] [[更新トークン]]から[[アクセストークン]]を求めている場合には、
新しい[[更新トークン]]を発行しても構いません。その[[適用範囲]]
([[scope]]) は元の[[更新トークン]]と同じでなければ[['''なりません''']]。
その場合には[[認可鯖]]は古い[[更新トークン]]を取り消し ([[revoke]])
して構いませんし、[[クライアント]]は古い[[更新トークン]]を破棄しなければ[['''なりません''']]。
[SRC[>>1]]
[72] その場合には、 [CODE(HTTP)[[[200]]]] [[応答]]で次の[[引数]]を
[[JSON]] ([CODE(MIME)@en[[[application/json]]]]) [[payload body]] の
[[JSONオブジェクト]]の名前と値 ([[文字列]]なら [[JSON文字列]]、
[[数値]]なら [[JSON数値]]) に含めます [SRC[>>71]]。
[FIG(list members)[
[FIGCAPTION[
[[payload body]] ([[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, >>1]]。
[88] その場合には、 [CODE(HTTP)[[[200]]]] [[応答]]で次の[[引数]]を
[[JSON]] ([CODE(MIME)@en[[[application/json]]]]) [[payload body]] の
[[JSONオブジェクト]]の名前と値 ([[文字列]]なら [[JSON文字列]]、
[[数値]]なら [[JSON数値]]) に含めます [SRC[>>87]]。
[FIG(list members)[
[FIGCAPTION[
[[payload body]] ([[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]]。