/
446.txt
501 lines (392 loc) · 34.5 KB
/
446.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
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
* 仕様書
[REFS[
- [3] '''[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.2>'''
- [21] [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-4.15>
- [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-3.1>'''
- [36] [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.1>
- [41] [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.2.1>
- [44] [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.1>
- [33] [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>
- [48] [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>
- [73] [CITE@en[Final: OpenID Connect Core 1.0 incorporating errata set 1]] ([TIME[2014-11-09 04:00:29 +09:00]] 版) <http://openid.net/specs/openid-connect-core-1_0.html#ImplicitFlowAuth>
]REFS]
* OAuth 1.0 資源所有者認可
[5] [[OAuth 1.0]] [[クライアント]]は[[鯖]]に[[トークンcredentials]]を要求するに先立ち、
[[鯖]]に対してアクセス要求を[RUBYB[[[認可]]]@en[authorize]]するよう[[利用者]]に求めなければ[['''なりません''']] [SRC[>>3]]。
この手順を[DFN[[RUBYB[[[資源所有者認可]]]@en[resource owner authorization]]]]といいます。
[6] [[クライアント]]は、何らかの方法で[[鯖]]が[[広告]]した[[資源所有者認可]]の[[エンドポイント]]の
[[URL]] を次の通り編集しつつ[[要求URL]] としなければ[['''なりません''']]。
[[クライアント]]はその[[要求URL]]を[[HTTPリダイレクト]]その他の方法で[[資源所有者]]の[[利用者エージェント]]にアクセスさせます。
この時使う[[要求メソッド]]は [CODE(HTTP)@en[[[GET]]]] でなければ[['''なりません''']]。 [SRC[>>3]]
[7] その [[URL]] の [[query]] に [CODE(URI)@en[[[oauth_token]]]] [[引数]]を追加します。
[FIG(list members)[
[FIGCAPTION[
[[URL query]] ([CODE(MIME)@en[[[application/x-www-form-urlencoded]]]])
]FIGCAPTION]
:[CODE(URI)@en[[[oauth_token]]]]:[[一時credentials要求]]で[[鯖]]から[[クライアント]]に提供された[[一時credentials]]の[[識別子]]
([CODE(HTTP)@en[[[oauth_token]]]] [[引数]]の値) とします。
ただし、[[鯖]]は[[資源所有者]]に他の方法で[[一時credentials]]の識別子を示させる方法を用意しているなら、
この[[引数]]を省略可能にできます。 [SRC[>>3]]
]FIG]
[8] [[鯖]]は、その他の[[引数]]も規定しても構いません [SRC[>>3]]。
[91] [[OAuth 1.0]] の拡張である [CODE(URI)@en[[[xoauth_response_format]]]]
[[引数]]を使うと、通常の[[リダイレクト]]のかわりに [[XML]] や [[JSON]]
などで結果を [CODE(HTTP)@en[[[POST]]]] させることを求めることができます。
[[JSONP]] のための [CODE(URI)@en[[[xoauth_json_callback]]]] [[引数]]も規定されています。
;; [CODE(URI)@en[[[xoauth_response_format]]]] 参照。
;; 実装例は見当たりません。
[EG[
[88] [[Twitter]] は [CODE[[[force_login]]]]、[CODE[[[screen_name]]]]
を規定しています [SRC[>>87, >>89]]。いずれも省略可能です。
[81] [[Google]] は [CODE[[[hd]]]], [CODE[[[hl]]]], [CODE[[[btmpl]]]]
を規定していました。いずれも省略可能でした。 [SRC[>>80]]
[108] [[Fitbit]] は [CODE[[[locale]]]]、[CODE[[[display]]]]、
[CODE[[[requestCredentials]]]] を規定しています [SRC[>>107]]。
[110] [[WP-API]] は [CODE[[[wp_scope]]]] を規定しています [SRC[>>109]]。
[116] [[Dropbox]] は [CODE[[[locale]]]]、[CODE[[[disable_signup]]]]
を規定しています [SRC[>>115]]。
[128] [[Evernote]] は [CODE(URI)@en[[[preferRegistration]]]] [[引数]]を規定しています
[SRC[>>127]]。
[130] [[UserVoice]] は [CODE[[[guid]]]], [CODE[[[sso]]]], [CODE[[[scheme]]]]
を規定しています [SRC[>>129]]。
[REFS[
- [87] [CITE[GET oauth/authorize | Twitter Developers]] ([TIME[2015-03-05 11:15:35 +09:00]] 版) <https://dev.twitter.com/oauth/reference/get/oauth/authorize>
- [89] [CITE[GET oauth/authenticate | Twitter Developers]] ([TIME[2015-03-05 11:25:36 +09:00]] 版) <https://dev.twitter.com/oauth/reference/get/oauth/authenticate>
- [80] [CITE@ja[OAuth 1.0 API Reference - Google Accounts Authentication and Authorization — Google Developers]] ([TIME[2014-12-05 11:52:26 +09:00]] 版) <https://developers.google.com/accounts/docs/OAuth_ref#GetAuth>
- [107] [CITE[OAuth Authentication in the Fitbit API - API - Confluence]] ([TIME[2015-03-06 08:29:40 +09:00]] 版) <https://wiki.fitbit.com/display/API/OAuth+Authentication+in+the+Fitbit+API>
- [109] [CITE@en[OAuth1/spec.md at master · WP-API/OAuth1]] ([TIME[2015-03-06 08:42:54 +09:00]] 版) <https://github.com/WP-API/OAuth1/blob/master/docs/spec.md>
- [115] [CITE@en[Dropbox - Core API - endpoint reference]] ([TIME[2015-03-06 09:07:10 +09:00]] 版) <https://www.dropbox.com/developers/core/docs>
- [127] [CITE@en[認証 - Evernote Developers]] ([TIME[2015-03-06 09:30:38 +09:00]] 版) <https://dev.evernote.com/intl/jp/doc/articles/authentication.php>
- [129] [CITE@en[UserVoice OAuth Reference - UserVoice Developer]] ([[UserVoice]] 著, [TIME[2015-01-24 06:02:32 +09:00]] 版) <https://developer.uservoice.com/docs/api/oauth/#_api_v1_oauth_authorize_>
]REFS]
]EG]
[9] [[資源所有者認可]]で[[保安輸送路]]を使うか否かは[[鯖]]に任されていて、
[[OAuth]] としては規定されていません [SRC[>>3]]。
[10] [[鯖]]はまず[[資源所有者]]の [[identity]] を[RUBYB[検証]@en[verify]]しなければ[['''なりません''']]。
その後認可要求をどう処理するかは[[鯖]]に委ねられています。 [SRC[>>3]]
;; [16] 一般的には、[[鯖]]はまず[[資源所有者]]がその[[Webアプリケーション]]における[[アカウント]]で[[ログイン]]状態にあるか
([[Cookie認証]]等で) 確認し、必要なら[[ログイン]]処理を行います。
次に[[一時credentials]]から調べた [[OAuth]] [[クライアント]]についての登録情報や、
(あれば) その[[Webアプリケーション]]における可能な操作の範囲 (いわゆる [[scope]])
など判断に必要な情報を表示し、[[資源所有者]]に対して[[認可]]するか否かの選択を求めます。
([[ログイン]]していない場合、[[ログイン]]と[[認可]]を同時に確認する実装もあります。)
;; [18] 既に一部の [[scope]] について[[認可]]していて、更に追加の [[scope]]
の[[認可]]を求められている場合に差分だけ表示して確認を求める実装もあります。
また新たに要求された [[scope]] をすべて[[認可]]済みの時に、
確認を省略して直ちに [[HTTPリダイレクト]]する実装もあります [SRC[>>21]]。
ただしその場合は[[セキュリティー]]的に問題ないか、[[鯖]]も[[資源所有者]]側の実装者も十分検討する必要があります。
特に[[クライアントcredentials]]が流出している場合には、
[[資源所有者]]が気づかないうちに[[トークンcredentials]]を与えてしまうことになるので危険です
[SRC[>>21]]。無確認で[[リダイレクト]]するのは特定の限定された [[scope]]
のみとするなど、配慮が必要です [SRC[>>21]]。
[53] [[鯖]]は [[CSRF]] 対策が必要です。
[12] [[鯖]]は、[[資源所有者]]が[[認可]]すると判断したら、
[[一時credentials要求]]の [CODE(URI)@en[[[oauth_callback]]]] [[引数]]、
あるいはその他の手段で指定された[[コールバックURL]]があれば、
[[資源所有者]]をそこに[[リダイレクト]]します。 [SRC[>>3]]
[13] [[コールバックURL]] の [[query]] には次の[[引数]]を追加しなければ[['''なりません''']] [SRC[>>3]]。
既に [[query]] があるなら、末尾に追加しなければ[['''なりません''']] [SRC[>>3]]。
[FIG(list members)[
[FIGCAPTION[
[[URL query]]
]FIGCAPTION]
:[14] [CODE(URI)@en[[[oauth_token]]]]:[[クライアント]]から受信した[[一時credentials]]の[[識別子]] [SRC[>>3]]。
:[15] [CODE(URI)@en[[[oauth_verifier]]]]:[RUBYB[[[検証符号]]]@en[verification code]] [SRC[>>3]]。
]FIG]
[111] [[WP-API]] は [CODE[[[wp_scope]]]] [[引数]]も追加します [SRC[>>109]]。
[117] [[Dropbox]] は [CODE[[[uid]]]] [[引数]]も追加します [SRC[>>115]]。
;; [20] [[コールバックURL]] は不適切な値が指定されるかもしれません。
[CODE(URI)@en[[[oauth_callback]]]] を参照してください。
[17] [[鯖]]は、[[クライアント]]が[[コールバックURL]] が提供しなかった場合には、
[[検証符号]]を表示し、[[資源所有者]]に対して手動で[[クライアント]]に入力するよう指示する[['''べきです''']] [SRC[>>3]]。
[118] [[資源所有者認可]]で[[資源所有者]]が[[認可]]しないことを選択した場合の動作は、
[[OAuth]] 仕様としては規定されていません。[[鯖]]により[[コールバックURL]]
にそのまま[[リダイレクト]]したり、別途設定した取り消し時の [[URL]]
に[[リダイレクト]]したりします。[[クライアント]]側に[[リダイレクト]]しなければならないとの規定もありません。
[119] [[Dropbox]] は、[[コールバックURL]]に [CODE[[[not_approved]]]]
[[引数]]を追加して[[リダイレクト]]します [SRC[>>115]]。
* OAuth 2.0 認可エンドポイント
[2] [[OAuth 2.0]] [[認可鯖]]の[DFN[[RUBYB[[[認可エンドポイント]]]@en[authorization endpoint]]]]は、
[[資源所有者]]から[[認可承諾]]を得るために使うものです。
[[認可符号承諾型]]と[[暗示的承諾型]]で使います。 [SRC[>>1]]
** 認可エンドポイントへの要求
[22] [[クライアント]]が[[認可エンドポイント]]の位置を知る方法は [[OAuth]]
仕様の範囲外ですが、通常は[[サービス]]の[[ドキュメント]]により示されます [SRC[>>1]]。
[24] [[認可エンドポイント]]では [[TLS]] を使わなければ[['''なりません''']] [SRC[>>1, >>48]]。
[[クライアント]]は [[RFC 6125]] により[[認可鯖]]の[[TLS証明書]]を検証し[[鯖]]の
[[identity]] を[[認証]]しなければ[['''なりません''']] [SRC[>>48]]
([[HTTPS鯖認証]])。
;; [57] [[spoofing]] により[[認可鯖]]が攻撃者に入れ替わっている危険性がありますから、
[[鯖]]の確認は重要です [SRC[>>56]]。
[REFS[
- [56] [CITE@en[RFC 6819 - OAuth 2.0 Threat Model and Security Considerations]] ([TIME[2015-02-10 06:43:00 +09:00]] 版) <http://tools.ietf.org/html/rfc6819#section-4.2.1>
]REFS]
[23] [[認可エンドポイント]]の [[URL]] には [CODE(MIME)@en[[[application/x-www-form-urlencoded]]]]
形式の [[query]] を含めても構いません。[[素片識別子]]を含んでは[['''なりません''']]。
[[query]] が含まれる場合には、[[引数]]を追加する場合には元の [[query]]
を残して追加しなければ[['''なりません''']]。 [SRC[>>1]]
[37] [[認可符号]]または[[アクセストークン]]を取得するために[[資源所有者]]を[[リダイレクト]]する [[URL]]
の構築時には、[[引数]]を [[URL query]] に [CODE(MIME)@en[[[application/x-www-form-urlencoded]]]]
形式で指定します [SRC[>>36, >>44]]。次の[[引数]]があります。
[FIG(list members)[
[FIGCAPTION[
[[URL query]] ([CODE(MIME)@en[[[application/x-www-form-urlencoded]]]])
]FIGCAPTION]
:[68] [CODE(URI)@en[[[response_type]]]]:[[認可符号]]の取得なら [CODE(URI)@en[[[code]]]]、
[[アクセストークン]]の取得なら [CODE(URI)@en[[[token]]]] でなければ[['''なりません''']]
[SRC[>>36, >>44]]。[[OpenID Connect]] [[暗示フロー]]なら
[CODE(URI)@en[[[id_token]] [[token]]]] または [CODE(URI)@en[[[id_token]]]]
としなければ[['''なりません''']] [SRC[>>73]]。
:[69] [CODE(URI)@en[[[client_id]]]]:[[クライアント識別子]]を指定しなければ[['''なりません''']]
[SRC[>>36, >>44]]。
:[70] [CODE(URI)@en[[[redirect_uri]]]]:[[リダイレクトURL]]を指定できます [SRC[>>36, >>44]]。
:[71] [CODE(URI)@en[[[scope]]]]:[[適用範囲]]を指定できます [SRC[>>36, >>44]]。
:[72] [CODE(URI)@en[[[state]]]]:局所状態を表す値を指定する[['''べきです''']] [SRC[>>36, >>44]]。
:[CODE(URI)@en[[[code_challenge]]]]: [[PKCE]]
:[CODE(URI)@en[[[code_challenge_method]]]]: [[PKCE]]
]FIG]
[67] [[OpenID Connect]] は、次の[[引数]]を規定しています。いくつかは必須です。
[FIG(short list)[
- [CODE(URI)@en[[[nonce]]]]
- [CODE(URI)@en[[[claims]]]]
- [CODE(URI)@en[[[display]]]]
- [CODE(URI)@en[[[prompt]]]]
- [CODE(URI)@en[[[max_age]]]]
- [CODE(URI)@en[[[ui_locales]]]]
- [CODE(URI)@en[[[id_token_hint]]]]
- [CODE(URI)@en[[[login_hint]]]]
- [CODE(URI)@en[[[openid2_realm]]]] [SRC[>>90]]
- [CODE(URI)@en[[[registration]]]]
- [CODE(URI)@en[[[request]]]]
- [CODE(URI)@en[[[request_uri]]]]
- [CODE(URI)@en[[[response_mode]]]]
- [CODE(URI)@en[[[acr_values]]]]
]FIG]
[75] [[Google]] は [[OpenID 2.0]] からの移行のための独自の [CODE(URI)@en[[[openid.realm]]]]
と独自の [CODE[[[hd]]]]、[CODE[[[access_type]]]]、
[CODE[[[include_granted_scopes]]]] を追加しています [SRC[>>76]]。
[CODE@en[[[approval_prompt]]]] [SRC[>>77]] という[[引数]]もあるようです。
[83] [[Azure]] は [CODE(URI)@en[[[resource]]]] と [CODE(URI)@en[[[domain_hint]]]]
を追加しています [SRC[>>82]]。
[93] [[Spotify]] は [CODE(URI)@en[[[show_dialog]]]] を追加しています [SRC[>>92]]。
[95] [[Slack]] は [CODE(URI)@en[[[team]]]] を追加しています [SRC[>>94]]。
[97] [[reddit]] は [CODE(URI)@en[[[duration]]]] を追加しています [SRC[>>96]]。
[99] [[Salesforce]] は [CODE(URI)@en[[[code_challenge]]]], [CODE(URI)@en[[[immediate]]]]
を追加しています [SRC[>>98]]。
[103] [[SurveyMonkey]] は [CODE(URI)@en[[[api_key]]]] を追加しています [SRC[>>102]]。
[106] [[Viadeo]] は [CODE(URI)@en[[[lang]]]], [CODE(URI)@en[[[cancel_url]]]]
を追加しています [SRC[>>105]]。
[113] [[Yahoo!]] は [CODE(URI)@en[[[language]]]] を追加しています [SRC[>>112]]。
[121] [[Dropbox]] は [CODE(URI)@en[[[force_reapprove]]]] と [CODE(URI)@en[[[disable_signup]]]]
を追加しています [SRC[>>120]]。
[REFS[
- [76] [CITE@ja[OpenID Connect (OAuth 2.0 for Login) - Google Accounts Authentication and Authorization — Google Developers]] ([TIME[2015-02-04 03:07:27 +09:00]] 版) <https://developers.google.com/accounts/docs/OpenIDConnect>
- [77] [CITE@ja[Using OAuth 2.0 for Web Server Applications - Google Accounts Authentication and Authorization — Google Developers]] ([TIME[2014-12-05 11:52:25 +09:00]] 版) <https://developers.google.com/accounts/docs/OAuth2WebServer>
- [82] [CITE@en[OAuth 2.0 in Azure AD]] ([TIME[2015-03-05 10:30:09 +09:00]] 版) <https://msdn.microsoft.com/en-us/library/azure/dn645545.aspx>
- [90] [CITE@en[draft: OpenID 2.0 to OpenID Connect Migration 1.0 - draft 08]] ([TIME[2015-02-02 07:51:11 +09:00]] 版) <http://openid.net/specs/openid-connect-migration-1_0.html>
- [92] [CITE@en-US[Web API Authorization Guide - Spotify Developer]] ([TIME[2015-03-05 15:59:09 +09:00]] 版) <https://developer.spotify.com/web-api/authorization-guide/>
- [94] [CITE@en[OAuth | Slack]] ([[Slack]] 著, [TIME[2015-03-05 16:04:09 +09:00]] 版) <https://api.slack.com/docs/oauth>
- [96] [CITE@en[OAuth2 · reddit/reddit Wiki]] ([TIME[2015-03-05 16:27:33 +09:00]] 版) <https://github.com/reddit/reddit/wiki/OAuth2#user-content-authorization>
- [98] [CITE[Understanding the Web Server OAuth Authentication Flow]] ([TIME[2015-02-28 04:30:54 +09:00]] 版) <https://www.salesforce.com/us/developer/docs/api_rest/Content/intro_understanding_web_server_oauth_flow.htm>
- [102] [CITE@en[SurveyMonkey - Guide OAuth]] ([TIME[2015-03-05 17:23:37 +09:00]] 版) <https://developer.surveymonkey.com/mashery/guide_oauth>
- [105] [CITE@en-US[OAuth 2.0 Authentication | Viadeo API]] ([TIME[2015-03-05 17:50:17 +09:00]] 版) <http://dev.viadeo.com/documentation/authentication/oauth-authentication/>
- [112] [CITE[Yahoo OAuth 2.0 Guide - Yahoo Developer Network]] ([TIME[2015-03-06 08:50:28 +09:00]] 版) <https://developer.yahoo.com/oauth2/guide/>
- [120] [CITE@en[Dropbox - Core API - endpoint reference]] ([TIME[2015-03-06 09:07:10 +09:00]] 版) <https://www.dropbox.com/developers/core/docs>
- [131] [CITE[楽天ウェブサービス(RAKUTEN WEBSERVICE)]] ([TIME[2015-03-24 23:58:21 +09:00]] 版) <http://webservice.rakuten.co.jp/document/oauth>
]REFS]
[74] [[OpenID Connect]] は [[URL query]] を直接使うのではなく、
[[JWT]] [[要求オブジェクト]]によって間接的に指定する方法も規定しています。
[31] [[クライアント]]は、[[要求]]の [CODE(URI)@en[[[response_type]]]]
[[引数]]で [CODE(URI)@en[[[code]]]] ([[認可符号承諾型]]) か
[CODE(URI)@en[[[token]]]] ([[暗示的承諾型]]) か拡張の[[承諾型]]を表す値のいずれかを指定しなければ[['''なりません''']] [SRC[>>1]]。
[29] [[要求]]の[[引数]]は、複数指定しては[['''なりません''']] [SRC[>>1]]。
[25] [[認可鯖]]は、[[認可エンドポイント]]において [CODE(HTTP)@en[[[GET]]]]
[[要求メソッド]]に対応しなければ[['''なりません''']]。 [CODE(HTTP)@en[[[POST]]]]
[[要求メソッド]]に対応しても構いません。 [SRC[>>1]]
[EG[
[132] [[楽天]]は [CODE(HTTP)@en[[[GET]]]] と [CODE(HTTP)@en[[[POST]]]]
に対応しています [SRC[>>131]]。
]EG]
** 認可エンドポイントでの処理
[4] [[認可鯖]]は、まず[[資源所有者]]を[[認証]]
([[identity]] を[RUBYB[検証]@en[verify]]) しなければ[['''なりません''']] [SRC[>>1, >>36]]。
[[認可鯖]]が[[資源所有者]]を[[認証]]する方法は、 [[OAuth]]
仕様の範囲外で、[[利用者名]]と[[合言葉]]による[[ログイン]]であれ、
[[セッションクッキー]]であれ、任意の方法を使うことができます [SRC[>>1]]。
;; >>122
[52] [[認可エンドポイント]]では [[CSRF]] 対策を行わなければ[['''なりません''']] [SRC[>>48]]。
[32] [[認可鯖]]は、 [CODE(URI)@en[[[response_type]]]] [[引数]]が指定されていない時や理解できない時は、
[[誤り]]を返さなければ[['''なりません''']] [SRC[>>1]]。
[35] [[認可鯖]]はすべての[[必須]]の[[引数]]が指定されており、[[妥当]]であることを確認します。
[SRC[>>36, >>44]]
[26] [[要求]]の[[引数]]で値のないものは、指定されなかったものとして扱わなければ[['''なりません''']] [SRC[>>1]]。
;; [27] 値がないというのは、 [CODE(MIME)@en[[[application/x-www-form-urlencoded]]]]
で [CODE[[[=]]]] が含まれない組のことでしょうか? [[空文字列]]と区別されるということでしょうか?
[28] [[認可鯖]]は、認識できない[[引数]]を無視しなければ[['''なりません''']] [SRC[>>1]]。
[38] [[認可鯖]]は、[[資源所有者]]に尋ねるなり、その他何らかの手段を使うなりして、
[[資源所有者]]から[[認可]]するかの決定を得ます [SRC[>>36, >>44]]。
** リダイレクトエンドポイントへのリダイレクト
[34] [[認可鯖]]は、[[資源所有者]]がアクセス要求を承諾したら、
[[資源所有者]]を[[クライアント]] (の[[リダイレクトエンドポイント]])
へと[[リダイレクト]]により戻します [SRC[>>1, >>36, >>44]]。
[39] [[認可符号]]を求められている場合で[[資源所有者]]の[[認可]]が得られた場合には、
[[リダイレクトURL]]の [[query]] には
[CODE(MIME)@en[[[application/x-www-form-urlencoded]]]]
形式で次の[[引数]]を追加します [SRC[>>36]]。
[FIG(list members)[
[FIGCAPTION[
[[URL query]] ([CODE(MIME)@en[[[application/x-www-form-urlencoded]]]])
]FIGCAPTION]
:[CODE(URI)@en[[[code]]]]:[[認可鯖]]が生成した[[認可符号]]を指定しなければ[['''なりません''']]。
:[CODE(URI)@en[[[state]]]]:[[クライアント]]が[[認可]]の要求に [CODE(URI)@en[[[state]]]]
[[引数]]を指定していれば、まったく同じ値を指定しなければ[['''なりません''']]。
]FIG]
[84] [[Azure]] は更に [CODE(URI)@en[[[admin_consent]]]] と
[CODE(URI)@en[[[session_state]]]] を追加しています [SRC[>>82]]。
[45] [[アクセストークン]]を求められている場合で[[資源所有者]]の[[認可]]が得られた場合には、
[[リダイレクトURL]]の[[素片識別子]]には
[CODE(MIME)@en[[[application/x-www-form-urlencoded]]]]
形式で次の[[引数]]を追加します [SRC[>>33]]。
[FIG(list members)[
[FIGCAPTION[
[[素片識別子]] ([CODE(MIME)@en[[[application/x-www-form-urlencoded]]]])
]FIGCAPTION]
:[CODE(URI)@en[[[access_token]]]]:[[認可鯖]]が発行した[[アクセストークン]]を指定しなければ[['''なりません''']] [SRC[>>33]]。
:[CODE(URI)@en[[[token_type]]]]:発行した[[トークン]]の種類を指定しなければ[['''なりません''']]
[SRC[>>33]]。
:[CODE(URI)@en[[[expires_in]]]]:[[アクセストークン]]の[[寿命]]を[[秒]]単位で指定する[['''べきです''']] [SRC[>>33]]。
:[CODE(URI)@en[[[scope]]]]:[[クライアント]]が要求した[[適用範囲]]と[[アクセストークン]]の[[適用範囲]]が異なるなら、指定しなければ[['''なりません''']]。同じ場合も指定できます。 [SRC[>>33]]
:[CODE(URI)@en[[[state]]]]:[[クライアント]]が[[認可]]の要求に [CODE(URI)@en[[[state]]]]
[[引数]]を指定していれば、まったく同じ値を指定しなければ[['''なりません''']] [SRC[>>33]]。
:[CODE(URI)@en[[[id_token]]]]:[[OpenID Connect]] の場合は指定しなければ[['''なりません''']]。
]FIG]
;; [46] この場合[[更新トークン]]を発行しては[['''なりません''']] [SRC[>>33]]。
[100] [[Salesforce]] は独自の [CODE(URI)@en[[[id]]]], [CODE(URI)@en[[[instance_url]]]],
[CODE(URI)@en[[[issued_at]]]], [CODE(URI)@en[[[signature]]]] を指定するようです。 [SRC[>>101]]
[114] [[Yahoo!]] は独自の [CODE@en[[[xoauth_yahoo_guid]]]]
を指定するようです [SRC[>>112]]。
[REFS[
- [101] [CITE[Force.com REST API Developer's Guide]] ([TIME[2012-11-22 10:44:00 +09:00]] 版) <https://www.salesforce.com/us/developer/docs/api_rest/>
]REFS]
[43] [[資源所有者]]がアクセス要求を拒んだ場合や[[リダイレクトURL]]の欠如や非妥当ではない点で[[要求]]に問題がある場合には、
[[認可符号]]を求められているなら[[リダイレクトURL]]の [[query]]、
[[アクセストークン]]を求められているなら[[リダイレクトURL]] の[[素片識別子]]に
[CODE(MIME)@en[[[application/x-www-form-urlencoded]]]]
形式で次の[[引数]]を追加します [SRC[>>41, >>33]]。
[FIG(list members)[
[FIGCAPTION[
[[URL query]]/[[素片識別子]] ([CODE(MIME)@en[[[application/x-www-form-urlencoded]]]])
]FIGCAPTION]
:[CODE(URI)@en[[[error]]]]:[[誤り符号]]を指定しなければ[['''なりません''']]。
:[CODE(URI)@en[[[error_description]]]]:[[人間可読]]な[[誤り]]の説明を指定して構いません。
:[CODE(URI)@en[[[error_uri]]]]:[[人間可読]]な[[誤り]]の説明を含む[[Webページ]]の [[URL]]
を指定して構いません。
:[CODE(URI)@en[[[state]]]]:[[クライアント]]が[[認可]]の要求に [CODE(URI)@en[[[state]]]]
[[引数]]を指定していれば、まったく同じ値を指定しなければ[['''なりません''']]。
]FIG]
[30] [[応答]]の[[引数]]は、複数指定しては[['''なりません''']] [SRC[>>1]]。
[78] [[OpenID]] による拡張である[[要求]]の [CODE(URI)@en[[[request_mode]]]] [[引数]]は、
[[URL query]] と[[素片識別子]]、あるいは [CODE(MIME)@en[[[application/x-www-form-urlencoded]]]]
のいずれの方法で[[応答]]の[[引数]]を返すべきかを指定するものです。
[79] [[Google]] の拡張は[[リダイレクトURL]]の指定により[[素片識別子]]でなく
[[URL query]] を使うことを求めたり、[[リダイレクト]]のかわりに[[認可符号]]を含む
[[HTML文書]]を表示させること、[[窓]]を閉じることを求める[[HTML文書]]を表示させることを指定できるようにしています。
;; [40] [[リダイレクトエンドポイント]]、[[認可符号]]も参照。
[42] [[リダイレクトURL]]が指定されていない場合、[[非妥当]]な場合、一致しない場合や、
[[クライアント識別子]]が指定されない場合や[[非妥当]]な場合には、
[[資源所有者]]に[[誤り]]を知らせる[['''べき''']]であり、
自動的に[[非妥当]]な[[リダイレクトURL]]に[[リダイレクト]]しては[['''なりません''']]。
[SRC[>>1, >>41, >>33]]
;; [51] [[OAuth 1.0]] の [CODE(URI)@en[[[oauth_callback]]=[[oob]]]]
に相当する仕組みは用意されていません。他の[[承諾型]]を使うなどするべきです。
* 資源所有者に対する認可の確認画面
[122] [[認可鯖]]は[[認可]]するか尋ねるに当って [[HTTP]] [[クライアント]]が当該サービス上のどの[[資源所有者]]であるか[[認証]]する必要があります。この[[認証]]は
[[Cookie認証]]その他当該サービスの従来の方式によるもので、 [[OAuth]]
の仕様の範囲外です。
[123] [[HTTP]] [[クライアント]]が[[Cookie]]を有していないなど[[認証]]されない状態でアクセスしてきている場合には、
[[ログイン]]画面へ誘導する、あるいは[[認可]]と同時に[[ログイン]]を求める、
[[認可]]と同時に [[credentials]] の入力を求めるといった方法でどの[[資源所有者]]か特定する必要が生じます。
;; [124] そのため、[[資源所有者認可]]ステップは複数回の[[認可鯖]]-[[HTTP]][[クライアント]]
([[資源所有者]]) 間のやり取りで構成される場合があります。
[125] [[認可鯖]]のサービス上のアカウントを既に保有していない [[HTTP]] [[クライアント]]からのアクセスだった場合には、
新規の[[アカウント]]登録を求める[[認可鯖]]もあります。そのような利用方法を認めていない場合や、
認めるかどうかを [[OAuth]] [[クライアント]]に指定させる場合もあります。
;; [126] 特にこの場合には次のステップに進むまで時間がかかることがあり、 [[OAuth 1.0]]
[[一時credentials]]の有効期限を超過する虞もあります。
[11] 要求されたアクセスを[[認可]]するかどうか [[OAuth 1.0]]
[[鯖]]が[[資源所有者]]に尋ねるときには、
[[一時credentials]]と[[クライアント]]の [[identity]]
との関連付けに基づき、アクセスを要求している[[クライアント]]についての情報を表示する[['''べきです''']]。
表示に際しては、その情報が[RUBYB[検証]@en[verify]]されたものかどうか示す[['''べきです''']]。
[SRC[>>3]]
[50] [[OAuth 2.0]] [[認可鯖]]は、[[資源所有者]]の[[認証]]を明示的に行った上で、
[[クライアント]]や要求されている[[認可]]の[[適用範囲]]や[[寿命]]についての情報を[[資源所有者]]に提供する[['''べきです''']]。
現在の[[クライアント]]に照らしてその情報を確認し[[認可]]するかどうかを判断するのは[[資源所有者]]の責任です。 [SRC[>>48]]
;; [[トークンエンドポイント]]の[[クライアント認証]]の項も参照。
[59] [[認可鯖]]は[[資源所有者]]に対して[[認可]]の[[適用範囲]]を理解可能な形で説明し、
必要以上の権限を[[クライアント]]に与えてしまわないように注意する必要があります [SRC[>>58]]。
[61] [[認可鯖]]は、既に過去に[[認可]]を得ている場合には、
[[資源所有者]]に対する確認を省いて自動的に[[リダイレクト]]して[[クライアント]]に戻すことができます [SRC[>>60]]。
[49] [[OAuth 2.0]] [[認可鯖]]は、繰り返される[[認可]]の要求について、
[[クライアント認証]]が行われる場合やその他の手段で本来の[[クライアント]]から求められていると確認できる場合を除き、
(明示的に[[資源所有者]]が操作せずに) 自動的に処理する[['''べきではありません''']] [SRC[>>48, >>62]]。
また自動承認する[[適用範囲]]を限定することも好ましいかもしれません [SRC[>>60]]。
;; [86] [[Twitter]] その他 [SRC[>>85, >>104, >>107]]
は[[OAuthログイン]]と[[認可]]で[[資源所有者認可]]エンドポイントを別にしており、
後者では自動リダイレクトはしないとしています。
[19] この確認画面は[[クリックジャッキング]]対策が必要です [SRC[>>63]]。
また[[Webブラウザー]]以外で表示したり、[[アドレスバー]]を隠したりするのは[[フィッシング]]の疑いを拭い去れないため、避けるべきと考えられています。
[47] [[ネイティブアプリケーション]]は埋め込み[[ブラウザー]]
([[アプリ内ブラウザー]]) ではなく外部の[[ブラウザー]]を使う[['''べきです''']] [SRC[>>48]]。
[55] 不正な[[クライアント]]は埋め込み[[ブラウザー]]を使って、
[[資源所有者]]の[[認証]]で入力された[[利用者名]]と[[合言葉]]を盗む [SRC[>>54]] など、
不適切な動作をするかもしれません。 ([[認可]]に限らず) 埋め込み[[ブラウザー]]によって[[フィッシングサイト]]を表示するなどの危険性があります。
[[利用者]]に啓蒙する、[[アプリマーケット]]で審査するといった対策は挙げられてはいますが [SRC[>>54]]、
[[OAuth]] の仕様の内外を問わず、根本的に解決するのは難しい問題です。
[65] また不正な[[クライアント]]は埋め込み[[ブラウザー]]を使って[[資源所有者]]に無断で機械的に[[認可]]
([[認可鯖]]の[[フォーム]]を勝手に [CODE(HTTP)@en[[[POST]]]] など) する [SRC[>>64]]
こともあるかもしれません。 [[CAPTCHA]] などにより[[資源所有者]]が実際に操作していることを確認したり、
[[認可]]後に[[電子メール]]などで[[資源所有者]]に通知したりする対策が必要かもしれません [SRC[>>64]]。
[REFS[
- [85] [CITE[3-legged authorization | Twitter Developers]] ([TIME[2015-03-05 11:08:34 +09:00]] 版) <https://dev.twitter.com/oauth/3-legged>
- [104] [CITE[Connecting]] ([TIME[2015-03-05 17:39:49 +09:00]] 版) <https://developer.foursquare.com/overview/auth>
- [54] [CITE@en[RFC 6819 - OAuth 2.0 Threat Model and Security Considerations]] ([TIME[2015-02-10 06:43:00 +09:00]] 版) <http://tools.ietf.org/html/rfc6819#section-4.1.4>
- [58] [CITE@en[RFC 6819 - OAuth 2.0 Threat Model and Security Considerations]] ([TIME[2015-02-10 06:43:00 +09:00]] 版) <http://tools.ietf.org/html/rfc6819#section-4.2.2>
- [60] [CITE@en[RFC 6819 - OAuth 2.0 Threat Model and Security Considerations]] ([TIME[2015-02-10 06:43:00 +09:00]] 版) <http://tools.ietf.org/html/rfc6819#section-4.2.3>
- [62] [CITE@en[RFC 6819 - OAuth 2.0 Threat Model and Security Considerations]] ([TIME[2015-02-10 06:43:00 +09:00]] 版) <http://tools.ietf.org/html/rfc6819#section-4.4.1.4>
- [63] [CITE@en[RFC 6819 - OAuth 2.0 Threat Model and Security Considerations]] ([TIME[2015-02-10 06:43:00 +09:00]] 版) <http://tools.ietf.org/html/rfc6819#section-4.4.1.9>
- [64] [CITE@en[RFC 6819 - OAuth 2.0 Threat Model and Security Considerations]] ([TIME[2015-02-10 06:43:00 +09:00]] 版) <http://tools.ietf.org/html/rfc6819#section-4.4.1.10>
]REFS]
[FIG(quote)[
[FIGCAPTION[
[66] [CITE@en[Final: OpenID Connect Core 1.0 incorporating errata set 1]]
([TIME[2014-11-09 04:00:29 +09:00]] 版)
<http://openid.net/specs/openid-connect-core-1_0.html#Terminology>
]FIGCAPTION]
> Authorization Request
> OAuth 2.0 Authorization Request as defined by '''['''RFC6749''']'''.
]FIG]
[FIG(quote)[
[FIGCAPTION[
[133] [CITE@en[Using OAuth 2.0 — Fitbit Web API Docs]]
([TIME[2016-10-05 06:00:11 +09:00]])
<https://dev.fitbit.com/docs/oauth2/>
]FIGCAPTION]
> Any attempt to embed the OAuth 2.0 authentication page will result in your application being banned from the Fitbit API.
> For security consideration, the OAuth 2.0 authorization page must be presented in a dedicated browser view. Fitbit users can only confirm they are authenticating with the genuine Fitbit.com site if they have the tools provided by the browser, such as the URL bar and Transport Layer Security (TLS) certificate information.
> For native applications, this means the authorization page must open in the default browser. Native applications can use custom URL schemes as redirect URIs to redirect the user back from the browser to the application requesting permission.
> iOS applications may use the SFSafariViewController class instead of app switching to Safari. Use of the WKWebView or UIWebView class is prohibited.
> Android applications may use Chrome Custom Tabs instead of app switching to the default browser. Use of WebView is prohibited.
> For web applications, do not use an iframe. Web applications may use a pop-up window, so long as the URL bar is visible.
]FIG]
[FIG(quote)[
[FIGCAPTION[
[134] [CITE@ja[認証と認可 | Cacoo Developer API | Nulab]]
( ([TIME[2017-09-13 07:21:22 +09:00]]))
<https://developer.nulab-inc.com/ja/docs/cacoo/auth/#2-oauth>
]FIGCAPTION]
> OAuth での認証からアカウント登録を行う場合、以下のパラメータを Authorize の URL に指定することで、アカウント登録フォームへの事前入力ができます。
> Name Description
> signup.mailAddress アカウントのメールアドレス
> signup.nickname アカウントのニックネーム
]FIG]