/
374.txt
199 lines (145 loc) · 13.5 KB
/
374.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
[10] [DFN[[RUBYB[[[クライアントcredentials]]]@en[client credentials]]]]は、
[[OAuthクライアント]]を識別、認証するための [[credentials]] です。
* 仕様書
[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-3>
-- [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-3.1>
-- [9] [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-3.4.2>
- [11] [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.6>
- [15] [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>
- [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-1.3.4>
- [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-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-2.2>
-- [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-2.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-3.2.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.1.1>
- [59] [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>
]REFS]
* クライアントの登録
[5] [[OAuth 1.0]] では、[[認証された要求]]の作成に先立って[[クライアント]]と[[鯖]]との間で[[クライアントcredentials]]
を準備しておく必要があります [SRC[>>3]]。
[24] [[OAuth 2.0]] では、利用に先立って[[クライアント]]は[[認可鯖]]に自身を登録することになっています
[SRC[>>20]]。
[[認可鯖]]は、登録された[[クライアント]]に[[クライアント識別子]]を発行します。
[27] しかしその具体的な方法は、 [[OAuth 1.0]] [SRC[>>3]] も [[OAuth 2.0]] [SRC[>>20]]
も仕様の範囲外としています。
;; [6] 一般的には、当該[[Webアプリケーション]]の管理画面等で[[クライアント]]を登録することで、
[[クライアントcredentials]]が生成されるという形が採られています。
;; [25] しかし[[クライアント]]と[[認可鯖]]が直接やり取りして登録する必要はなく、
自己または第三者の発行する表明に基づいたり、
信頼できる通信路によるクライアント発見法を用いたりしても構いません。 [SRC[>>20]]
[26] [[OAuth 2.0]] [[クライアント]]の登録においては、
[[クライアント]]の開発者が次の情報を提供しなければ[['''なりません''']] [SRC[>>21]]。
[FIG(list members)[
- [28] [RUBYB[[[クライアント型]]]@en[client type]] (必須)
- [29] [RUBYB[[[クライアントリダイレクトURL]]]@en[client redirection URL]] (ほとんどの場合)
- [30] その他[[認可鯖]]が必要な情報 (例えば[[応用]]名、
[[Webサイト]]、説明文、[[ロゴ]]、規約への同意など)
]FIG]
[48] [[OAuth 2.0]] は未登録の[[クライアント]]の利用を排除していませんが、
[[OAuth 2.0]] 仕様の範囲外ともしています [SRC[>>20]]。
* OAuth 1.0 クライアント credentials
[4] [[クライアントcredentials]]は、
[RUBYB[[[固有識別子]]]@en[unique identifier]]と、
[RUBYB[[[共有秘密]]]@en[shared-secret]]
([DFN[[RUBYB[[[クライアント共有秘密]]]@en[client shared-secret]]]] [SRC[>>9]]) か
[RUBYB[[[RSA鍵組]]]@en[RSA key pair]] ([[RSA公開鍵]]と[[RSA秘密鍵]])
によって構成されます [SRC[>>3]]。
;; [2] 元は[[クライアント識別子]]のことを [DFN[[[consumer key]]]]、
[[クライアント共有秘密]]のことを [DFN[[[consumer secret]]]]
と呼んでいました [SRC[>>1]]。
[52] [[クライアント識別子]]は、[[認証された要求]]において[[クライアント]]を識別するために
[CODE(URI)@en[[[oauth_consumer_key]]]] [[引数]]で使います。
[32] [[クライアント共有秘密]]は、 [CODE(HTTP)@en[[[oauth_signature]]=[[HMAC-SHA1]]]]
や [CODE(HTTP)@en[[[oauth_signature]]=[[PLAINTEXT]]]] で使います。
[[RSA鍵]]は、 [CODE(HTTP)@en[[[oauth_sianature]]=[[RSA-SHA1]]]] で使います。
;; [53] [[共有秘密]]と鍵の組の両方を保持する必要はありません。
用いない[[署名方式]]のものは不要です。
[54] [[クライアント識別子]]は、秘密ではありません。
[12] [[共有秘密]]や [[RSA秘密鍵]]は、[[クライアント]]が秘密に保持しておく必要があります。
[[共有秘密]]は[[鯖]]も[[署名]]の計算のために保持しておく必要があります。
;; [CODE(HTTP)@en[[[oauth_signature]]=[[PLAINTEXT]]]] では[[共有秘密]]が[[要求]]の一部として転送されます。
[13] [[クライアント]]が[[ネイティブアプリケーション]]で[[実行ファイル]]が配布される場合のように、
[[クライアントcredentials]]を攻撃者が入手できてしまう場合もあります。
[[鯖]]は[[クライアント]]の[RUBYB[識別]@en[identity]]の[RUBYB[検証]@en[verify]]に[[クライアントcredentials]]だけでなく、
可能なら[[IPアドレス]]その他の要素も考慮する[RUBYB[べき]@en[should]]です。 [SRC[>>11]]
;; [14] [[実行ファイル]]が配布されるパターンで [[IPアドレス]]をチェックしても何の意味も無い気がしますが・・・。
不特定多数に配布される[[ネイティブアプリケーション]]を[[クライアント]]として [[OAuth 1.0]]
[[Web API]] を利用する場合には[[クライアントcredentials]]は意味を持たないものとして諦める以外に有効な策は無さそうです。
;; [16] [[資源所有者認可]]で[[資源所有者]]に明示的に確認せずに[[トークンcredentials]]
が発行されるような実装になっていると、公開されている[[クライアントcredentials]]
を使って第三者が[[トークンcredentials]]を取得できてしまい、特に危険です [SRC[>>15]]。
([[資源所有者認可]]も参照。)
;; [33] [[OAuth 2.0]] ではこの性質を[[クライアント型]]と呼んで分類しており、
[[クライアントcredentials]]を秘匿できない場合も考慮されています。
* OAuth 2.0 クライアント識別子
[31] [[認可鯖]]は、登録された[[クライアント]]に対して[DFN[[RUBYB[[[クライアント識別子]]]@en[client identifier]]]]を発行します。
[[クライアント識別子]]は、[[クライアント]]が提供した登録情報を表す、
[[認可鯖]]について固有の[[文字列]]です。 [SRC[>>20]]
[22] [[クライアント識別子]]は、秘密ではありません。これ単独で[[クライアント]]の[[認証]]に使っては[['''なりません''']]。 [SRC[>>20]]
[23] [[クライアント識別子]]の長さは [[OAuth]] 仕様としては未定義となっています。
[[クライアント]]は仮定を置くべきではありません。
[[認可鯖]]は長さを文書化する[['''べきです''']]。 [SRC[>>20]]
* OAuth 2.0 クライアント認証
[35] [[クライアント型]]が[[機密]]の[[クライアント]]については、
[[クライアント]]と[[認可鯖]]の間では[[認可鯖]]の要件を満たす任意の[[認証]]方式により[[クライアント]]を[[認証]]して構いません [SRC[>>34]]。
;; [36] 一般的には[[合言葉]]や、[[公開鍵]]と[[秘密鍵]]の組のようなものを[[認可鯖]]が発行または登録して使います [SRC[>>34]]。
[37] [[認可鯖]]は[[クライアント型]]が[[公開]]の[[クライアント]]とも[[認証]]を使って構いませんが、
[[クライアント]]の識別のためにこれに依存しては[['''なりません''']] [SRC[>>34]]。
[38] 複数の[[認証]]方法を単独の[[要求]]で併用しては[['''なりません''']] [SRC[>>34]]。
[46] [[認可鯖]]は、[[合言葉]]で[[認証]]する時は、 [[TLS]] を要求しなければ[['''なりません''']]
[SRC[>>34]]。また[[総当たり攻撃]]に対して[[エンドポイント]]を保護しなければ[['''なりません''']]
[SRC[>>34]]。
[39] [RUBYB[[[合言葉]]]@en[password]]を使う場合、[[基本認証]]を使って構いません。
[[クライアント]]に[[合言葉]]を発行した[[認可鯖]]は、[[基本認証]]に対応しなければ[['''なりません''']]。
[SRC[>>34]]
[40] [[基本認証]]を使う場合、[[利用者名]]は[[クライアント識別子]]を [[UTF-8]] で
[CODE(MIME)@en[[[application/x-www-form-urlencoded]]]] [[符号化]]したもの、
[[合言葉]]は[[クライアント]]の[[合言葉]]を [[UTF-8]] で
[CODE(MIME)@en[[[application/x-www-form-urlencoded]]]] [[符号化]]したものとします。
[SRC[>>34]]
;; [41] 入力が名前と値の組でないわけですが、
[CODE(MIME)@en[[[application/x-www-form-urlencoded]]]]
版[[パーセント符号化]]を使うという意味だと思われます。
[51] なぜか[[認可鯖]]側の解釈の方法は規定されていません。
;; [42] どの[[文字]]が[[パーセント符号化]]されるのか [[RFC]] および参照先の [[HTML4]]
では曖昧なので、[[鯖]]は一旦[[復号]]してから比較する必要がありそうです。
[43] [[認可鯖]]は、 [[payload body]] に[[引数]]を指定する方式に対応しても構いません。
しかし[[クライアント]]は[[基本認証]]を使えない場合のみこの方法を使う[['''べきです''']]。
[[payload body]] でなく[[要求URL]]中で指定しては[['''なりません''']]。 [SRC[>>34]]
[45] その場合、[[クライアント]]は [CODE(URI)@en[[[client_id]]]] [[引数]]に[[クライアント識別子]]を、
[CODE(URI)@en[[[client_secret]]]] [[引数]]に[RUBYB[クライアント秘密]@en[client secret]]を指定しなければ[['''なりません''']]。
ただし[[クライアント秘密]]が[[空文字列]]なら、 [CODE(URI)@en[[[client_secret]]]]
[[引数]]は省略できます。 [SRC[>>34]]
;; [44] [CODE(MIME)@en[[[application/x-www-form-urlencoded]]]] の例が示されています [SRC[>>34]]
が、その他の方式でも良いのか不明です。
[47] [[認可鯖]]は他の[[HTTP認証]]方式に対応しても構いませんが、
[[クライアント識別子]]と当該認証方式との対応関係を定義しなければ[['''なりません''']]
[SRC[>>34]]。
* OAuth 2.0 クライアント credentials 承諾型
[18] [[OAuth 2.0]] [[承諾型]]としての[[クライアントcredentials]]は、
[[クライアントcredentials]] (やその他の形の[[クライアント]]の[[認証]])
を[[認可承諾]]として使うものです [SRC[>>17]]。
[19] 本[[承諾型]]は、[[認可]]の範囲 ([[scope]]) が[[クライアント]]の制御下にある[[被保護資源]]に限定される時
([[クライアント]]が[[資源所有者]]でもある時) や、
[[認可鯖]]と事前に合意した[[被保護資源]]に限定される時に使うことができます [SRC[>>17]]。
* [CODE(URI)@en[oauth_consumer_key]] 引数 (OAuth 1.0)
[8] [DFN[[CODE(URI)@en[[[oauth_consumer_key]]]]]] は、[[認証された要求]]で[[クライアントcredentials]]の[[識別子]]
([[consumer key]]) を表す [SRC[>>7]] [[引数]]です。
* [CODE(URI)@en[client_id]] 引数 (OAuth 2.0)
[49] [DFN[[CODE(URI)@en[[[client_id]]]]]] [[引数]]は、
[[クライアント認証]]で[[クライアント識別子]]を表します [SRC[>>34]]。
[[クライアント認証]]を行う場合、この[[引数]]は[[必須]]です [SRC[>>34]]。
[58] [[認可エンドポイント]]で[[認可符号]]を取得する場合、
この[[引数]]は指定しなければ[['''なりません''']] [SRC[>>57]]。
指定されない場合や[[非妥当]]な場合、[[資源所有者]]に[[誤り]]を知らせる[['''べきです''']]
[SRC[>>59]]。
[56] [CODE(URI)@en[[[client_id]]]] [[引数]]は[[認証]]しない場合でも[[トークンエンドポイント]]への[[要求]]
[SRC[>>55]] で指定できる場合、指定しなければならない場合があります。
[[認可鯖]]は、[[トークンエンドポイント]]で適宜[[認証]]および検査しなければなりません。
;; [[トークンエンドポイント]]参照。
* [CODE(URI)@en[[[client_secret]]]] 引数 (OAuth 2.0)
[50] [DFN[[CODE(URI)@en[[[client_secret]]]]]] [[引数]]は、
[[クライアント認証]]で[[クライアント秘密]]を表します [SRC[>>34]]。
この[[引数]]は、値が[[空文字列]]なら省略できます [SRC[>>34]]。