Help us understand the problem. What is going on with this article?

OAuth 2.0 のフローとクライアントタイプの関係

More than 1 year has passed since last update.

RFC 6749(The OAuth 2.0 Authorization Framework)が定義する 4 つのアクセストークン発行フローと、クライアントタイプ(RFC 6749, 2.1. Client Type)の組み合わせについて、誤解を招くことが多いので、簡潔にまとめます。

仕様上、フローとクライアントタイプの組み合わせのうち、明示的に禁止されているのは、クライアントクレデンシャルズフローと Public クライアントの組み合わせだけです。これを表にすると次のようになります。

フロー クライアントタイプ
Confidential Public
認可コード ○ 利用可能 ○ 利用可能
インプリシット ○ 利用可能 ○ 利用可能
リソースオーナーパスワード
クレデンシャルズ
○ 利用可能 ○ 利用可能
クライアント
クレデンシャルズ
○ 利用可能 × 利用不可

認可コードフローについては、『4.1.3. Access Token Request』に "If the client type is confidential"(クライアントタイプが confidential の場合) という表現があることから、逆に Confidential ではない場合も存在することが分かりますので、Confidential クライアントも Public クライアントも認可コードフローを使ってもいいことが分かります。Financial-grade API の仕様をみても、このことは明らかです。

インプリシットフローは、トークンリクエストを行わないので、クライアント認証をおこなう機会がありません。結果としてクライアントシークレットを使う機会がありません。しかしこれは、必ずしもクライアントが Public クライアントである、または Public クライアントでなければならない、という意味ではありません。『3.1.2.2. Registration Requirements』に "Confidential clients utilizing the implicit grant type"(インプリシットフローを使う confidential クライアント)という表現があることからも、Confidential クライアントがインプリシットフローを使うケースも想定されていることが分かります。

リソースオーナーパスワードクレデンシャルズフローについては、認可コードフローと同様、『4.3.2. Access Token Request』に "If the client type is confidential"(クライアントタイプが confidential の場合) という表現があることから、逆に Confidential ではない場合も存在することが分かりますので、Confidential クライアントも Public クライアントもリソースオーナーパスワードクレデンシャルズフローを使ってもいいことが分かります。

クライアントクレデンシャルズフローについては、『4.4. Client Credentials Grant』に明示的に "The client credentials grant type MUST only be used by confidential clients."(クライアントクレデンシャルズフローを使えるのは confidential クライアントのみ)と書かれているので、Public クライアントはクライアントクレデンシャルズフローを使ってはいけません。

クライアントはどれか一つのフローしか使ってはいけない、というわけではありません。このことは、『OpenID Connect Dynamic Client Registration 1.0』の『2. Client Metadata』が定義する grant_types メタデータに、クライアントが使用する可能性のあるフローを複数列挙できることからも明らかです。

例えば、Confidential クライアントは、ある時はクライアントクレデンシャルズフローを使ってもよいですし、またある時はインプリシットフローを使ってもかまいません。このケースにおいて、誤解を引き起こす要因があるとすれば、インプリシットフローではクライアント認証をおこなう機会がないので、そのことが、「Public クライアントはトークンエンドポイントでクライアント認証をおこなわない」と似ている点です。そのため、「インプリシットフローを使うクライアントは Public クライアント」と勘違いされることがあります。

クライアントはどれか一つのフローしか使ってはならないと思い込んでいると、フローとクライアントタイプの関係を勘違いしてしまうので、注意してください。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした