/
430.txt
147 lines (114 loc) · 9.66 KB
/
430.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
[7] [DFN[[RUBYB[[[認可承諾]]]@en[authorization grant]]]]フローは、 [[OAuth 2.0]]
において[[クライアント]]が[[資源所有者]]にかわって[[資源]]にアクセスするための[[アクセストークン]]を[[認可鯖]]から得るための手続きです。
その方法として [[OAuth 2.0]] では4種類の[DFN[[RUBYB[[[承諾型]]]@en[grant type]]]]と[[更新トークン]]からの取得の計5通りのフローが用意されています。
[DFN[[CODE(URI)@en[[[grant_type]]]]]] [[引数]]は、[[クライアント]]が用いたい[[承諾型]]を指定するものです。
* 仕様書
[REFS[
- [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-1.3>
- [4] [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>
-- [12] [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.3>
-- [13] [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>
-- [14] [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>
-- [5] [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.5>
- [9] [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-8.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-6>
- [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-8.3>
- [24] [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.10>
- [28] [CITE@en[Final: OAuth 2.0 Multiple Response Type Encoding Practices]] ([TIME[2014-02-26 05:28:26 +09:00]] 版) <http://openid.net/specs/oauth-v2-multiple-response-types-1_0.html>
]REFS]
* 認可承諾
[2] [DFN[[RUBYB[認可承諾]@en[authorization grant]]]]は、
[[資源所有者]]の ([[被保護資源]]へのアクセスの) [[認可]]を表す[[credentials]]で、
[[クライアント]]が[[アクセストークン]]を得るために使うフローです [SRC[>>1]]。
[3] [[OAuth 2.0]] は4種類の[DFN[[RUBYB[[[承諾型]]]@en[grant type]]]]を定義すると共に、
拡張も認めています [SRC[>>1]]。
[FIG(short list)[
- [[認可符号]]
- [[暗示的承諾]]
- [[資源所有者合言葉credentials]]
- [[クライアントcredentials]]
]FIG]
[8] [[承諾型]]の一種ではありませんが (とはいえ [CODE(URI)@en[[[grant_type]]]]
の値が割り当てられてはいますが)、既にいずれかの[[承諾型]]フローにより取得した[[更新トークン]]を使って新たに[[アクセストークン]]を取得するフロー
([CODE(URI)@en[[[grant_type]]=[[refresh_token]]]]) もあります。
[27] [[OpenID]] による [[OAuth 2.0]] の拡張 [SRC[>>28]] では、[[暗示的承諾]]の派生形
[CODE[[[id_token]]]] や、[[認可符号]]と[[暗示的承諾]]の中間形 ([[Hybrid Flow]])
を幾通りか規定しています。また「[CODE[[[reponse_type]]=[[none]]]]」なる形も規定しています。
これらは [CODE(URI)@en[[[response_type]]]] 引数により区別されます。
[29] [[Google]] は[[装置]]向けの [CODE(URI)@en[[[grant_type]]=[[http://oauth.net/grant_type/device/1.0]]]]
フローや [[OAuth 1.0]] から [[OAuth 2.0]] への移行のための
[CODE(URI)@en[[[urn:ietf:params:oauth:grant-type:migration:oauth1]]]] を規定しています。
[31] [[reddit]] は[[クライアントcredentials]][[承諾型]]と実質的に同じながら、
「[[ログアウト]]状態」や [[client_secret]] を持たない[[公開]]の[[クライアント]]が使うべき
[CODE(URI)@en[[[grant_type]]=[[https://oauth.reddit.com/grants/installed_client]]]]
を定義しています。
[38] [[SoundCloud]] は[[更新トークン]]のかわりに [[OAuth 1.0]]
[[アクセストークン]]を指定する [CODE[[[grant_type]]=[[oauth1_token]]]]
を実装しているようです。
* [CODE(URI)@en[grant_type]] 引数
[6] [[承諾型]]は、[[トークンエンドポイント]]の [DFN[[CODE(URI)@en[[[grant_type]]]]]]
[[引数]]で指定することになります。
;; [11] [[トークンエンドポイント]]を使わない[[暗示的承諾型]]を除きます。
[10] 値としては、次のものがあります。
[FIG(short list)[
- [CODE(URI)@en[[[authorization_code]]]]
- [CODE(URI)@en[[[password]]]]
- [CODE(URI)@en[[[client_credentials]]]]
- [CODE(URI)@en[[[fb_exchange_token]]]]
- [CODE(URI)@en[[[refresh_token]]]]
- [CODE(URI)@en[[[urn:ietf:params:oauth:grant-type:saml2-bearer]]]]
- [CODE(URI)@en[[[urn:ietf:params:oauth:grant-type:jwt-bearer]]]]
- [CODE(URI)@en[[[urn:ietf:params:oauth:grant-type:migration:oauth1]]]]
- [CODE(URI)@en[[[http://oauth.net/grant_type/device/1.0]]]]
- [CODE(URI)@en[[[https://oauth.reddit.com/grants/installed_client]]]]
- [CODE(URI)@en[[[oauth1_token]]]]
]FIG]
[17] その他、[[クライアント]]は[[認可鯖]]が定義する[[絶対URL]]によって拡張の[[承諾型]]を指定することができます [SRC[>>5, >>15]]。
[CODE(URI)@en[[[grant_type]]]] [[引数]]で独自の値を指定する他、
追加の[[引数]]も必要に応じて指定します。 [SRC[>>5]]
;; [22] [[OAuth 2.0]] の他の部分と違って、なぜか[[承諾型]]の拡張は[[絶対URL]]
に限定されていて、 [[URL]] でない短い値の登録は認められていないようです。
[[IANA登録簿]]も用意されていません。 ([[IETF]] の他の仕様書で規定される値も [[URL]]
になっていて、無駄に長くなっています。)
[25] 構文としては、1文字以上の[[ASCII英数字]]、[CODE[[[-]]]]、[CODE[[[.]]]]、
[CODE[[[_]]]] の列か、 [[RFC 3986]] [[URI参照]]のいずれかとされています [SRC[>>24]]。
;; [26] [[URI参照]]には[[相対URL]]も含まれるので、 >>10 および >>17
よりも構文上はかなり広い範囲の値が認められることとなります。この違いが意図的なものなのかどうかは不明です。
* 文脈
[18] [[認可鯖]]の[[トークンエンドポイント]]に対する[[認可符号]]から[[アクセストークン]]を取得する[[要求]]では、
[CODE(URI)@en[[[grant_type]]]] [[引数]]の値は [CODE(URI)@en[[[authorization_code]]]]
としなければ[['''なりません''']] [SRC[>>12]]。
[19] [[認可鯖]]の[[トークンエンドポイント]]に対する[[資源所有者合言葉credentials]]から[[アクセストークン]]を取得する[[要求]]では、
[CODE(URI)@en[[[grant_type]]]] [[引数]]の値は [CODE(URI)@en[[[password]]]]
としなければ[['''なりません''']] [SRC[>>13]]。
[20] [[認可鯖]]の[[トークンエンドポイント]]に対する[[クライアントcredentials]]から[[アクセストークン]]を取得する[[要求]]では、
[CODE(URI)@en[[[grant_type]]]] [[引数]]の値は [CODE(URI)@en[[[client_credentials]]]]
としなければ[['''なりません''']] [SRC[>>14]]。
[21] [[認可鯖]]の[[トークンエンドポイント]]に対する[[更新トークン]]から[[アクセストークン]]を取得する[[要求]]では、
[CODE(URI)@en[[[grant_type]]]] [[引数]]の値は [CODE(URI)@en[[[refresh_token]]]]
としなければ[['''なりません''']] [SRC[>>16]]。
* 歴史
[30] [[OAuth 1.0]] には[[承諾型]]に相当するものはありませんでしたが、
標準機能として [CODE(URI)@en[[[oauth_callback]]=[[oob]]]]、
[[Google]] 独自機能として [[2-legged OAuth]]、
[[Twitter]] 独自機能として [[xAuth]] がありました。
* 関連
[23] [CODE(URI)@en[[[response_type]]]] [[引数]]も[[承諾型]]を指定するものとされていますが、
そちらは[[認可エンドポイント]]で[[認可符号]]または[[暗示的承諾型]]のいずれかを選択するものとなっています。
[33] [[GitHub]] や [[Heroku]] は [[OAuth]] の通常のフローとは別に、 [[認可]]を操作する [[API]]
を用意しています [SRC[>>32, >>34]]。 [[OAuth]] フローを介さずに [[API]]
から[[アクセストークン]]を発行したり、 ([[トークン]]の [[revoke]] ではなく)
[[認可]]を取り消したりできます。
[REFS[
- [32] [CITE@en[Authorizations | GitHub API]] ([TIME[2015-03-05 18:02:01 +09:00]] 版) <https://developer.github.com/v3/oauth_authorizations/>
- [34] [CITE@en[Platform API Reference | Heroku Dev Center]] ([TIME[2015-03-06 08:18:07 +09:00]] 版) <https://devcenter.heroku.com/articles/platform-api-reference#oauth-authorization>
]REFS]
[35] [CITE@en[draft-recordon-oauth-v2-device-00 - OAuth 2.0 Device Profile]]
([TIME[2015-01-19 10:23:16 +09:00]] 版)
<https://tools.ietf.org/html/draft-recordon-oauth-v2-device-00>
[36] [CITE@en[draft-hunt-oauth-chain-01 - Chain Grant Type for OAuth2]]
([TIME[2015-01-27 00:08:36 +09:00]] 版)
<https://tools.ietf.org/html/draft-hunt-oauth-chain-01>
[37] [CITE@en[draft-zhou-oauth-owner-auth-01 - Owner Authorization Grant Type Profile for OAuth 2.0]]
([TIME[2015-02-19 18:40:51 +09:00]] 版)
<https://tools.ietf.org/html/draft-zhou-oauth-owner-auth-01>