[20] [DFN[[RUBYB[[[資源所有者合言葉credentials]]]@en[resource owner password credentials]]]][[承諾型]]は、
[[資源所有者]]の[RUBY[[[合言葉]]][パスワード]]を[[クライアント]]が直接受け取り、
これを[[認可鯖]]に渡すことで[[アクセストークン]]の交付を受ける[[承諾型]]です。

[21] 本[[承諾型]]は危険性が高いもので、やむを得ない場合を除き使うべきではないと考えられています。

* 仕様書

[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.3>
- [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.3>'''
- [11] [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>
- [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-10.7>
- [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-10.8>
- [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#section-10.10>
- [19] [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.3>
]REFS]

* 意味

[2] [RUBYB[[[資源所有者合言葉credentials]]]@en[resource owner password credentials]][[承諾型]]は、
[[アクセストークン]]を得るために[[資源所有者]]の [[credentials]] 
([RUBYB[[[利用者名]]]@en[username]]と[RUBYB[[[合言葉]]]@en[password]])
を直接[[認可承諾]]として使うものです。 [SRC[>>1]]

;; [6] [[認可符号]]フローや[[暗示的承諾型]]フローとは違って、[[クライアント]]が[[資源所有者]]の
[[credentials]] を一旦取得する必要があります。

[14] 本[[承諾型]]は[[合言葉]]を使う点、[[資源所有者]]が[[クライアント]]にそれを委ねなければならない点から、
特に危険性が大きいものです。
[[認可鯖]]は本[[承諾型]]で発行される[[アクセストークン]]の[[適用範囲]]と[[寿命]]を十分検討するべきです。
[[認可鯖]]および[[クライアント]]はできるだけ他の[[承諾型]]を使う[['''べきです''']]。 [SRC[>>13]]

;; [22] [[認可鯖]]は[[クライアント]]が[[資源所有者]]に対して明確に説明しているかどうかを一切関知できません。
他のフローでは[[認可鯖]]が[[資源所有者]]に対して行うような[[適用範囲]]の説明も、
本[[承諾型]]では機会がありません。例えば[[クライアント]]が読み取りのみ行うと説明しつつ、
実際には読み書きの両方が可能な[[適用範囲]]を[[認可鯖]]に求めることもあり得ます。

;; [23] ですから[[認可鯖]]は、他の手段、例えば[[電子メール]]による通知で、
事後であっても[[資源所有者]]に何が行われたか説明する必要があるかもしれません。

[16] なお[[資源所有者]]の[[合言葉]]を[[平文]]で送信しては[['''なりません''']]。

[17] [[認可鯖]]は、[[合言葉]]の推測による攻撃を防がなければ[['''なりません''']]。
生成された[[トークン]]の場合、
攻撃者が推測できる確率は 2[SUP[-128]] [[以下]]で[['''なければならず''']]、
2[SUP[-160]] [[以下]]である[['''べきです''']]。
そうでない[[末端利用者]]が扱う[[credentials]]の場合でも、
何らかの方法で保護しなければ[['''なりません''']]。 [SRC[>>18]]

* フロー

[7] まず[[資源所有者]]が[[クライアント]]に [[credentials]] 
([[利用者名]]と[[合言葉]])を提供します [SRC[>>5]]。
これをどのような形で行うかは、[[OAuth]] 仕様の範囲外 [SRC[>>5]] とされています。

[8] [[クライアント]]は[[資源所有者]]から受信した[[利用者名]]と[[合言葉]]を指定した要求を[[認可鯖]]の[[トークンエンドポイント]]に送信し、
[[アクセストークン]]を求めます [SRC[>>5]]。

[9] [[認可鯖]]の[[トークンエンドポイント]]は[[クライアント認証]]を行い[[資源所有者]]の
[[credentials]] を検証し、[[アクセストークン]]を発行します [SRC[>>5]]。
[[更新トークン]]の発行も禁止はされていません。しかし本フローの危険性を鑑み、
発行しない方がよいかもしれません [SRC[>>19]]。

[10] [[クライアント]]は、[[アクセストークン]]を受信したら[[クライアント]]の
[[credentials]] を破棄しなければ[['''なりません''']] [SRC[>>5]]。

[FIG(sequence)[
:R:[[資源所有者]]
:C:[[クライアント]]
:S:[[認可鯖]]
:R -> C:[[資源所有者]]の [[credentials]] を提供
:C -> S:[[トークンエンドポイント]]に [[credentials]] を送信
:S -> C:[[アクセストークン]]を発行
:#C#:[[credentials]] を破棄
]FIG]

* 文脈

[3] 本[[承諾型]]は、[[クライアント]]と[[資源所有者]]との間に高度な信頼がある場合
(例えば[[クライアント]]が当該[[装置]]の [[OS]] や高い[[特権]]を持つ[[応用]]である場合)
で、他の[[承諾型]]が馴染まない場合に限って使うべきです [SRC[>>1, >>5]]。
[[認可鯖]]は、本[[承諾型]]を有効にする際に特別に注意を払うべきであり、
他のフローが馴染まない場合に限って認めるべきです [SRC[>>5]]。

[4] 本[[承諾型]]は[[資源所有者]]の [[credentials]] ([[利用者名]]と[[合言葉]]) 
を (普通は対話的な[[フォーム]]により) [[クライアント]]が直接知ることができる場合に適しています
[SRC[>>1, >>5]]。既に[[基本認証]]や[[ダイジェスト認証]]に対応している[[クライアント]]が
[[OAuth]] に移行する時に、既に保存している [[credentials]] を[[アクセストークン]]に変換するためにも使うことができます
[SRC[>>5]]。いずれにせよ、 [[credentials]] は一旦[[アクセストークン]]を得たら不要となり、
以後保存する必要はありません [SRC[>>1]]。

[25] [[Salesfoces]] など [SRC[>>24, >>26, >>27]] が実装しています。

[REFS[
- [24] [CITE[Understanding the Username-Password OAuth Authentication Flow]] ([TIME[2015-02-28 04:30:54 +09:00]] 版) <https://www.salesforce.com/us/developer/docs/api_rest/Content/intro_understanding_username_password_oauth_flow.htm>
- [26] [CITE[Bitly API Documentation]] ([TIME[2014-11-01 00:33:47 +09:00]] 版) <http://dev.bitly.com/authentication.html>
- [27] [CITE@en[gitlabhq/oauth2.md at master · gitlabhq/gitlabhq]] ([TIME[2015-03-06 10:46:37 +09:00]] 版) <https://github.com/gitlabhq/gitlabhq/blob/master/doc/api/oauth2.md>
]REFS]

* [CODE(URI)@en[grant_type=password]]

[12] [[OAuth 2.0]] [[トークンエンドポイント]]の [CODE(URI)@en[[[grant_type]]]]
[[引数]]の値 [DFN[[CODE(URI)@en[[[password]]]]]] [SRC[>>11]] は、
[[資源所有者]]の [[credentials]] から[[アクセストークン]]を求める要求であることを表します。

[28] [CITE@en[draft-dehora-farrell-oauth-accesstoken-creds-02 - OAuth Access Tokens using credentials]]
([TIME[2015-01-27 14:55:01 +09:00]] 版)
<https://tools.ietf.org/html/draft-dehora-farrell-oauth-accesstoken-creds-02>

[FIG(quote)[
[FIGCAPTION[
[29] [CITE[Bitbucket API]]
([TIME[2017-09-08 16:59:11 +09:00]])
<https://developer.atlassian.com/bitbucket/api/2/reference/meta/authentication>
]FIGCAPTION]

> $ curl -X POST -u "client_id:secret" \
>   https://bitbucket.org/site/oauth2/access_token -d grant_type=password \
>   -d username={username} -d password={password}

]FIG]
