🌍

Azure AD アプリケーションの Web アプリ/API とネイティブの違いについて

に公開

はじめに

Azure AD でアプリケーションを登録する際、Web アプリ/APIネイティブ を選択できますが、両者の違いを解説します。

一般的なアプリの種類と使用するフローについては、以下のページが参考になります。

https://www.buildinsider.net/enterprise/openid/oauth20

ネイティブではクライアント シークレットを発行できない

Web アプリ/API の場合はクライアント シークレットを作成できます。Azure AD では 設定 - API アクセス - キー の項目で設定します。

ネイティブ の場合はクライアント シークレットを作成できません。

クライアント シークレットは秘匿化する必要があります。しかし、ネイティブ に分類される Windows アプリやモバイル アプリの場合、クライアントにアプリケーションを配布する必要があるため、クライアント シークレットを安全に保持できません。そのため、ネイティブ でアプリケーションを登録した場合は、クライアント シークレットを作成できない仕様となっています。

実行できるフローに制限がある

RFC 6749 で定義されている OAuth フローには、以下の種類があります。

名前 説明
Authorization Code Grant 認証後に認可サーバーから Authorization Code を発行してもらう認可フロー
Implicit Grant 暗黙的にアクセス トークンを取得する認可フロー
Resource Owner Password Credentials Grant 認証情報としてユーザー名とパスワードを使用する認可フロー
Client Credentials Grant バックグラウンドで動作するアプリケーション向けの認可フロー

これらのうち、Client Credentials Grant (grant_type=client_credentials) については、クライアント シークレットが必須となるため、利用できません。Client Credentials Grant は 委任されたアクセス許可 ではなく アプリケーションのアクセス許可 を利用するフローです。上記の理由により、ネイティブ では アプリケーションのアクセス許可 を利用できません。

Authorization Code Grant にも違いがあります。Web アプリ/API の場合は、アクセス トークンの要求 (/oauth2/token) でクライアント シークレットが必須です。しかし、ネイティブ の場合はクライアント シークレットを指定しなくてもアクセス トークンを取得できます。Windows アプリやモバイル アプリを開発していて、アクセス トークンの要求で失敗する場合は、アプリケーションの種類を誤って設定していないか確認してください。

おわりに

アプリケーションの種類によって Web アプリ/APIネイティブ のいずれかを適切に選択する必要があります。セキュリティを確保するためにも、これらの違いを理解しておくことが重要です。

Discussion