[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(middle list)[ [39] [[OAuth 2.0]] 本体の4つの[[承諾型]]
- [[認可符号]]
- [[暗示的承諾]]
- [[資源所有者合言葉credentials]]
- [[クライアントcredentials]]
]FIG]

[8] [[承諾型]]の一種ではありませんが 
[WEAK[(とはいえ [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(list)[ [40] [CODE[grant_type]] の値
- [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]]]]
- [CODE(URI)@en[urn:globus:auth:grant_type:dependent_token]]
- [CODE(URI)@en[urn:bitbucket:oauth2:jwt]]
]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[.][U+002E]]、
[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>