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 クライアント」と勘違いされることがあります。
クライアントはどれか一つのフローしか使ってはならないと思い込んでいると、フローとクライアントタイプの関係を勘違いしてしまうので、注意してください。