-
Notifications
You must be signed in to change notification settings - Fork 4
/
375.txt
185 lines (134 loc) · 13.3 KB
/
375.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
* 仕様書
[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-1.1>
- [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>
- [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>
- [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-1.4>
- [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-3.1.1>
- [57] [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>
- [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>
- [6] [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>
- [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-10.8>
- [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-10.10>
- [18] [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.12>
- [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-2>
- [36] [CITE@en[RFC 7009 - OAuth 2.0 Token Revocation]] ([TIME[2014-12-21 18:10:21 +09:00]] 版) <http://tools.ietf.org/html/rfc7009#section-2.1>
- [42] [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.11>
]REFS]
* OAuth 1.0 トークン credentials
[21] [DFN[[RUBYB[トークン]@en[token]]]]は、
[[鯖]]が発行する固有の識別子であり、
[[認証された要求]]と[[クライアント]]が[[認可]]を要求している、または取得した[[資源所有者]]とを関連付けるため[[クライアント]]が使うものです [SRC[>>1]]。
[[OAuth 1.0]] で用いられる [[credentials]] の一種で、仕様書中ではしばしば[DFN[[RUBYB[[[トークンcredentials]]]@en[token credentials]]]]とも呼ばれています。
[22] [[トークンcredentials]]は、
[DFN[[RUBYB[[[トークン識別子]]]@en[token identifier]]]]と[DFN[[RUBYB[[[トークン共有秘密]]]@en[token shared-secret]]]]で構成されます。
;; [2] 元はそれぞれ [DFN[[[access token]]]] および [DFN[[[access token secret]]]]
と呼んでいました [SRC[>>1]]。
;; [29] [[トークン識別子]]は[[認証された要求]]に直接含めて送信されますが、
[[トークン共有秘密]]は直接は含まれません。[[トークン識別子]]は公開されても問題は無いはずですが、
通常その必要がないので[[鯖]]と[[クライアント]]の間でだけ共有されます。
[[トークン共有秘密]]は[[鯖]]と[[クライアント]]の間で秘密にする必要があります。
;; [31] 厳密性を必要としない場面では、[[アクセストークン]]と[[アクセストークン秘密]]をまとめて「[[アクセストークン]]」と呼ぶこともあります。
* OAuth 2.0 アクセストークン
[24] [DFN[[RUBYB[[[アクセストークン]]]@en[access token]]]]は、
[[被保護資源]]へのアクセスに使う[[credentials]] であり、
[[クライアント]]に発行された[[認可]] ([[資源所有者]]が[[承諾]]したアクセスの範囲 ([[scope]])
や期間) を表す[[文字列]]です [SRC[>>23]]。
[25] 通常この[[文字列]]は[[クライアント]]には[[不透明]]なものです [SRC[>>23]]。
[[アクセストークン]]は[[認可]]情報を取得するために使う識別子でも構いませんし、
それ自体に[[認可]]情報 (と検証するための[[署名]]) を含んでいても構いません [SRC[>>23]]。
;; [30] [[OAuth 1.0]] [[アクセストークン]]は[[識別子]]と[[共有秘密]]の2つの値の組でしたが、
[[OAuth 2.0]] [[アクセストークン]]は1つの値です。
[20] [[アクセストークン]]を構成する[[文字]]は、[CODE(URI)@en[[[access_token]]]]
[[引数]]の構文より、1つ以上の[[印字可能ASCII文字]]に制限されます。
;; [[アクセストークン型]]によっては更に制限があります。
;; [44] [[アクセストークン型]]によっては[[アクセストークン]]自体の他に、
いくつかの追加の[[引数]]を使うことがあります。[[アクセストークン型]]を参照。
[60] [[アクセストークン]]の長さは、 [[OAuth]] 仕様上制限がありません。
[[クライアント]]は[[アクセストークン]]の長さに仮定を置くべきではありません。
[[認可鯖]]は、[[アクセストークン]]の長さを明文化する[['''べきです''']]。
[SRC[>>58, >>71]]
[15] [[認可鯖]]は、[[アクセストークン]]を推測できないようにしなければ[['''なりません''']] [SRC[>>6, >>17]]。
攻撃者が推測できる確率は 2[SUP[-128]] [[以下]]で[['''なければならず''']]、
2[SUP[-160]] [[以下]]である[['''べきです''']] [SRC[>>17]]。
[41] 攻撃者が[[認可鯖]]に[[認可符号]]を発行させる操作を大量に実行して[[認可符号]]を枯渇させるような[[DoS攻撃]]があり得ますから、
[[利用者]]ごとに発行数を制限するなど、対策を講じるべきです [SRC[>>42]]。
[26] [[クライアント]]が[[アクセストークン]]を使う際に、その他の[[認証]]の
[[credentials]] が必要であっても構いません (が、 [[OAuth]] の仕様の範囲外です)
[SRC[>>23]]。
;; [27] 例えば [[OAuth]] とは別に[[基本認証]]の [[credentials]] が必要かもしれません。
[11] [[アクセストークン]]は、転送や蓄積において[[機密]]を保持しなければ[['''ならず''']]、
[[認可鯖]]、適用対象の[[資源鯖]]、発行先の[[クライアント]]のみの間で共有しなければ[['''なりません''']]
[SRC[>>6]]。
;; [14] [[暗示的承諾型]]では[[資源所有者]]に[[アクセストークン]]が転送されるため、
この要件を完全には満たせません。
[28] [[アクセストークン]]は、[[認可承諾]]フローにより、
あるいは[[更新トークン]]を使って取得できます。
[4] [[アクセストークン]]には、種別 ([[トークン型]]) があり、それによって[[被保護資源]]にアクセスする際の[[認証]]方式が異なります。
[12] [[アクセストークン]]は、[[HTTPS]] [[サーバー認証]]のもとでしか転送しては[['''なりません''']]
[SRC[>>6, >>16]]。
;; [13] [[アクセストークン]]は[[認可エンドポイント]]や[[トークンエンドポイント]]で用いられますが、そこでは [[TLS]] が要求されています。
[[リダイレクトURL]]では [[TLS]] が原則とされていますが、[[平文]]も限定的に認められており、
その場合は >>12 を満たせません。
* アクセストークンの要求
[8] [[OAuth 1.0]] では、[[クライアント]]は[[鯖]]に[[トークン要求]]を送信することで、
[[トークンcredentials]] ([[アクセストークン]]と[[アクセストークン秘密]])
を取得できます。
[9] [[OAuth 2.0]] では、[[クライアント]]は[[鯖]]の[[トークンエンドポイント]]に要求を送信することで、
[[アクセストークン]]を取得できます。
([[暗示的承諾]]では、[[認可エンドポイント]]から取得できます。)
[45] [[Twitter]] は通常の [[OAuth]] フローとは別に、設定ページから
[[access token]], [[access token secret]] の組を発行する方法を用意しています [SRC[>>46, >>47]]。
[49] [[Slack]] は [[API]] の説明ページで[[アクセストークン]]を提供しています
[SRC[>>48]]。
[54] [[GitHub]] や [[Qiita]] [SRC[>>53]] などでは設定ページから[[アクセストークン]]を発行できます。
[58] [[Flickr]] は古い独自認証 API を使って [[OAuth 1.0]] [[access token]]/[[access token secret]]
を取得する [[API]] [SRC[>>56]] を用意しています。
[51] [[GitHub]] などは[[アクセストークン]]を発行する [[API]] も提供しています [SRC[>>50, >>52]]。 [[GitHub]] の場合は[[基本認証]]を使ったりします。
[[Bitly]] の場合は[[トークンエンドポイント]]を共有しており、
「OAuth Basic Authentication Flow」などとも称しているものの
[[OAuth]] とは異なる方法で[[基本認証]]を使った[[アクセストークン]]取得
[[API]] を提供しています [SRC[>>55]]。
[REFS[
- [56] [CITE@en-us[Flickr Services: Flickr API: flickr.auth.oauth.getAccessToken]] ([TIME[2015-03-06 01:26:26 +09:00]] 版) <https://www.flickr.com/services/api/flickr.auth.oauth.getAccessToken.html>
- [46] [CITE[Single-user OAuth with Examples | Twitter Developers]] ([TIME[2015-03-05 11:19:22 +09:00]] 版) <https://dev.twitter.com/oauth/overview/single-user>
- [47] [CITE[Tokens from dev.twitter.com | Twitter Developers]] ([TIME[2015-03-05 11:24:17 +09:00]] 版) <https://dev.twitter.com/oauth/overview/application-owner-access-tokens>
- [48] [CITE@en[Slack Web API | Slack]] ([[Slack]] 著, [TIME[2015-03-05 16:12:13 +09:00]] 版) <https://api.slack.com/web>
- [50] [CITE@en[Authorizations | GitHub API]] ([TIME[2015-03-05 18:02:01 +09:00]] 版) <https://developer.github.com/v3/oauth_authorizations/>
- [52] [CITE[Qiita API v2ドキュメント - Qiita:Developer]] ([TIME[2015-03-05 19:06:56 +09:00]] 版) <https://qiita.com/api/v2/docs#アクセストークン-1>
- [53] [CITE[Qiita API v2ドキュメント - Qiita:Developer]] ([TIME[2015-03-05 19:04:27 +09:00]] 版) <https://qiita.com/api/v2/docs#%E8%AA%8D%E8%A8%BC%E8%AA%8D%E5%8F%AF>
- [55] [CITE[Bitly API Documentation]] ([TIME[2014-11-01 00:33:47 +09:00]] 版) <http://dev.bitly.com/authentication.html>
]REFS]
* アクセストークンの利用
[10] [[アクセストークン]]を利用した[[被保護資源]]へのアクセス方法については、
[[資源鯖]]を参照。
* OAuth 1.0 トークンcredentialsの破棄
[5] [[鯖]]は、 [[token credentials]] が[[クライアント]]に後に、
[[資源所有者]]が[[token credentials]] を取り消し ([[revoke]]) できるようにする[['''べきです''']]
[SRC[>>3]]。
* [CODE(URI)@en[response_type=token]]
[32] [[OAuth 2.0]] [[認可エンドポイント]]の [CODE(URI)@en[[[response_type]]]] [[引数]]の値
[DFN[[CODE(URI)@en[[[token]]]]]] は、[[アクセストークン]]を要求している
([[暗示的承諾型]]である) ことを意味します [SRC[>>33, >>57]]。
* [CODE(URI)@en[access_token]] 引数
[59] [[OAuth 2.0]] [[認可エンドポイント]]からの[[リダイレクトURL]]に追加される[[素片識別子]]の[[引数]]
[DFN[[CODE(URI)@en[[[access_token]]]]]] は、[[アクセストークン]]を表します。
この[[引数]]は[[必須]]です [SRC[>>58]]。
[81] [[OAuth 2.0]] [[トークンエンドポイント]]からの [[JSON]] [[応答]]の[[引数]]
[DFN[[CODE(URI)@en[[[access_token]]]]]] は、[[アクセストークン]]を表します。
この[[引数]]は[[必須]]です [SRC[>>71]]。
[19] この[[引数]]の値は、1文字以上の[[印字可能ASCII文字]]の列です [SRC[>>18]]。
[35] [[資源鯖]]の [CODE(URI)@en[[[access_token]]]] [[引数]] [SRC[>>34]] は、
[[認証]]に使う[[アクセストークン]]を表します。
* [CODE(URI)@en[token_type_hint=access_token]]
[37] [CODE(URI)@en[[[token_type_hint]]]] [[引数]]の値
[DFN[[CODE(URI)@en[[[access_token]]]]]] は、[[アクセストークン]]を表します [SRC[>>36]]。
* セキュリティー
[39] [[クライアント]]は、[[アクセストークン]]を保存した[[ストレージ]]等に攻撃者がアクセスできないか注意する必要があります [SRC[>>38]]。
同じ環境で動作する他の[[プログラム]]から[[ストレージ]]にアクセスできるかもしれません。
動作している端末全体が盗まれることもあるかもしれません [SRC[>>38, >>43]]。
[40] そのような場合の対策という意味でも、[[認可鯖]]は[[資源所有者]]に対して発行済の[[アクセストークン]]を [[revoke]] させられる仕組みを提供するべきでしょう。
[REFS[
- [38] [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.3>
- [43] [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.2.2>
]REFS]