/
446.txt
395 lines (313 loc) · 27.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
* 仕様書
[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]]
[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>
]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]
;; [20] [[コールバックURL]] は不適切な値が指定されるかもしれません。
[CODE(URI)@en[[[oauth_callback]]]] を参照してください。
[17] [[鯖]]は、[[クライアント]]が[[コールバックURL]] が提供しなかった場合には、
[[検証符号]]を表示し、[[資源所有者]]に対して手動で[[クライアント]]に入力するよう指示する[['''べきです''']] [SRC[>>3]]。
* 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]]。
]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]]。
[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>
]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]]
** 認可エンドポイントでの処理
[4] [[認可鯖]]は、まず[[資源所有者]]を[[認証]]
([[identity]] を[RUBYB[検証]@en[verify]]) しなければ[['''なりません''']] [SRC[>>1, >>36]]。
[[認可鯖]]が[[資源所有者]]を[[認証]]する方法は、 [[OAuth]]
仕様の範囲外で、[[利用者名]]と[[合言葉]]による[[ログイン]]であれ、
[[セッションクッキー]]であれ、任意の方法を使うことができます [SRC[>>1]]。
[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]]
[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]]]]
に相当する仕組みは用意されていません。他の[[承諾型]]を使うなどするべきです。
* 資源所有者に対する認可の確認画面
[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]] は[[OAuthログイン]]と[[認可]]で[[資源所有者認可]]エンドポイントを別にしており、
後者では自動リダイレクトはしない [SRC[>>85]] としています。
[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>
- [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]