24
20

More than 5 years have passed since last update.

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

Posted at

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

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

24
20
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
24
20