Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
15
Help us understand the problem. What is going on with this article?
@TakahikoKawasaki

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 クライアント」と勘違いされることがあります。

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

15
Help us understand the problem. What is going on with this article?
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
TakahikoKawasaki
株式会社 Authlete の共同創業者。プログラマー兼代表取締役社長。

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
15
Help us understand the problem. What is going on with this article?