/
397.txt
124 lines (91 loc) · 8.37 KB
/
397.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
* 仕様書
[REFS[
- [1] [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.8>
- [3] '''[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.3>'''
- [15] [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>
- [16] [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>
- [17] [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>
- [19] [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>
- [20] [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>
- [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-5.1>
- [23] [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>
- [25] [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.3>
- [29] [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.7>
- [32] [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.8>
- [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#appendix-A.4>
- [34] [CITE@en[RFC 6750 - The OAuth 2.0 Authorization Framework: Bearer Token Usage]] ([TIME[2015-02-11 06:22:47 +09:00]] 版) <http://tools.ietf.org/html/rfc6750#section-3>
]REFS]
* OAuth 1.0 における scope
[2] [[OAuth 1.0]] は [[scope]] のような仕組みが必要なことがよくあるとしつつも、
その方式の標準化には踏み込んでいません [SRC[>>1]]。
[4] 各[[鯖]]は、それぞれの方法で [[scope]] の指定を認めていました。
[[scope]] の概念を持たない[[鯖]]もありました。
* OAuth 2.0 における scope
[14] [DFN[[[scope]]]] ([[適用範囲]]) は、[[アクセストークン]]によって[[資源所有者]]がアクセスすることを[[クライアント]]から認められている[[資源]]や操作の範囲を表すものです。
短い [[ASCII]] 文字列によって表されます。
[36] [CODE(HTTP)@en[[[scope]]]] の値は[[プログラム]]的に利用されることを想定しており、
[[末端利用者]]に表示することは想定していません [SRC[>>34]]。
** 構文
[7] [CODE(URI)@en[[[scope]]]] [[引数]]の値は、
[CODE[[[U+0020]]]] で区切った[[認可鯖]]定義の[[文字列]]のリストです [SRC[>>3, >>33, >>34]]。
[[文字列]]の順序は意味を持ちません [SRC[>>3, >>34]]。
[FIG(railroad)[
= 文字列
= *
== [CODE(char)[[[U+0020]]]]
== 文字列
]FIG]
[9] 各[[文字列]]は、[[印字可能ASCII文字]]のうち、 [CODE[[[U+0020]]]]、
[CODE[[[U+0022]]]]、[CODE[[[U+005C]]]] を除いたもので構成される1[[文字]]以上の列です
[SRC[>>3, >>33]]。
[REFS[
- [10] <http://chars.suikawiki.org/set/%24rfc6749:scope-token-char>
]REFS]
[8] 複数の[[文字列]]の指定は、それぞれの適用範囲を足していくことを表します [SRC[>>3]]。
** 文脈
*** クライアントによる指定
[5] [[OAuth 2.0]] [[クライアント]]は、[[認可エンドポイント]]
([[認証符号]]、[[暗示的承諾型]]) と[[トークンエンドポイント]]
([[資源所有者合言葉credentials]]、[[クライアントcredentials]]) で[[要求]]の
[CODE(URI)@en[[[scope]]]] [[引数]]によってアクセス要求の[RUBYB[適用範囲]@en[scope]]を指定することができます [SRC[>>3, >>15, >>16, >>19, >>20]]。
[24] [[クライアント]]は、[[トークンエンドポイント]]で[[更新トークン]]から[[アクセストークン]]を得る[[要求]]で
[CODE(URI)@en[[[scope]]]] [[引数]]によって取得したい[[アクセストークン]]の[[適用範囲]]を指定することができます。
ただし、元々[[資源所有者]]に[[承諾]]された[[適用範囲]]以外を指定してはなりません。
またこの[[引数]]省略すると、元々[[資源所有者]]に[[承諾]]された[[適用範囲]]を表します。
[SRC[>>23]]
[26] [[クライアント]]は、必要な最小の[[適用範囲]]を求める[['''べきです''']] [SRC[>>25]]。
*** 認可鯖による指定
[6] [[認可鯖]]は、発行した[[アクセストークン]]の適用範囲を[[クライアント]]に知らせるために[[応答]]で
[CODE(URI)@en[[[scope]]]] [[引数]]を指定します [SRC[>>3]]。
[18] [[認可鯖]]は、[[アクセストークン]]を求められた[[認可エンドポイント]]から[[リダイレクト]]される[[リダイレクトURL]]の[[素片識別子]]の
[CODE(URI)@en[[[scope]]]] [[引数]]によって[[アクセストークン]]の[[適用範囲]]を指定できます。
[[クライアント]]の要求と異なる[[適用範囲]]である場合には、
[CODE(URI)@en[[[scope]]]] [[引数]]を指定しなければ[['''なりません''']]。 [SRC[>>17]]
[22] [[認可鯖]]は、[[トークンエンドポイント]]からの[[アクセストークン]]を含む
[[JSON]] [[応答]]の
[CODE@en[[[scope]]]] [[引数]]によって[[アクセストークン]]の[[適用範囲]]を指定できます。
[[クライアント]]の要求と異なる[[適用範囲]]である場合には、
[CODE@en[[[scope]]]] [[引数]]を指定しなければ[['''なりません''']]。 [SRC[>>21]]
;; [27] [[クライアント]]の要求通りの[[適用範囲]]とする時は、
明示しても省略しても構いません。
*** 資源鯖による指定
[35] [[資源鯖]]は、 [CODE(HTTP)@en[[[WWW-Authenticate:]] [[Bearer]]]] [[ヘッダー]]に
[CODE(HTTP)@en[[[scope]]]] [[引数]]を指定できます [SRC[>>34]]。
** 処理
[11] [[認可鯖]]は、[[認可鯖]]の方針や[[資源所有者]]の指示、
[[クライアント]]の [[identity]] に基づき、
[[クライアント]]に指定された適用範囲の一部または全部を無視して構いません [SRC[>>3, >>25]]。
[[クライアント]]が要求した適用範囲と異なる[[アクセストークン]]を発行する時は、
[[応答]]に [CODE(URI)@en[[[scope]]]] [[引数]]を指定して[[アクセストークン]]の適用範囲を明示しなければ[['''なりません''']] [SRC[>>3]]。
[30] [[資源所有者合言葉credentials]]は特に危険であるとの認識から、
利用可能な[[適用範囲]]をより限定的にすることを検討するべきです [SRC[>>29]]。
[12] [[クライアント]]が[[認可エンドポイント]]への要求で [CODE(URI)@en[[[scope]]]]
[[引数]]を指定しなかった時は、予め定義された既定値として処理するか、
妥当でない適用範囲として失敗にしなければ[['''なりません''']] [SRC[>>3]]。
[13] [[認可鯖]]は適用範囲の要件と既定値を明文化する[['''べきです''']] [SRC[>>3]]。
[28] [[クライアント]]は、[[アクセストークン]]を得た時に [CODE(URI)@en[[[scope]]]]
[[引数]]を確認して、希望した[[適用範囲]]がすべて認められたかどうかを調べる必要があります。
一部しか認められなかったとしても、その理由までは示されないので、
[[クライアントの登録]]の設定を変更するなど[[認可鯖]]依存の方法で[[クライアント]]の開発者が手動で操作しなければならない可能性もあります。
** メモ
[31] [CODE(URI)@en[[[state]]]] [[引数]]の値には、[[クライアント]]や[[資源所有者]]の繊細な情報を[[平文]]で含める[['''べきではありません''']] [SRC[>>32]]。