ネイティブ認証を使用してサンプル Android モバイル アプリでユーザーをサインインさせ、API を呼び出す
この記事では、ASP.NET Core Web API を呼び出すサンプル Android モバイル アプリケーションを構成する方法について説明します。
前提条件
Web API アプリケーションを登録する
アプリケーション開発者以上として Microsoft Entra 管理センターにサインインします。
複数のテナントにアクセスできる場合、上部のメニューの [設定] アイコン を使用し、[ディレクトリとサブスクリプション] メニューから外部テナントに切り替えます。
[ID]>[アプリケーション]>[アプリの登録] を参照します。
[+ 新規登録] を選択します。
表示される [アプリケーションの登録] ページで、アプリケーションの登録情報を入力します。
[名前] セクションで、アプリのユーザーに表示されるわかりやすいアプリケーション名 (ciam-ToDoList-api など) を入力します。
[サポートされているアカウントの種類] で、 [この組織のディレクトリ内のアカウントのみ] を選択します。
[登録] を選択して、アプリケーションを作成します。
登録が完了すると、アプリケーションの [概要] ペインが表示されます。 アプリケーションのソース コードで使用するディレクトリ (テナント) ID とアプリケーション (クライアント) ID を記録します。
API スコープを構成する
クライアント アプリがユーザーのアクセス トークンを正常に取得するために、API は少なくとも 1 つのスコープ (委任されたアクセス許可とも呼ばれます) を発行する必要があります。 スコープを発行するには、次の手順に従います。
[アプリの登録] ページで、作成した API アプリケーション (ciam-ToDoList-api) を選択して [概要] ページを開きます。
[管理] の [API の公開] を選択します。
ページ上部の [アプリケーション ID URI] の横にある [追加] リンクを選択して、このアプリに一意の URI を生成します。
提案されたアプリケーション ID URI (
api://{clientId}
など) を受け入れ、[保存] を選択します。 Web アプリケーションで Web API のアクセス トークンを要求すると、API に対して定義する各スコープのプレフィックスとしてこの URI が追加されます。[この API で定義されるスコープ] で、 [スコープの追加] を選択します。
API への読み取りアクセスを定義する次の値を入力した後に、[スコープの追加] を選択して変更を保存します。
プロパティ 価値 スコープ名 ToDoList.Read 同意できるユーザー 管理者のみ 管理者の同意の表示名 'TodoListApi' を使用してユーザーの ToDo リストを読み取る 管理者の同意の説明 'TodoListApi' を使用して、アプリがユーザーの ToDo リストを読み取ることを許可します。 State 有効 もう一度 [スコープの追加] を選択し、API への読み取りおよび書き込みアクセスを定義する次の値を入力します。 [スコープの追加] を選択して変更を保存します。
プロパティ 価値 スコープ名 ToDoList.ReadWrite 同意できるユーザー 管理者のみ 管理者の同意の表示名 'ToDoListApi' を使用した、ユーザーの ToDo リストの読み取りと書き込み 管理者の同意の説明 'ToDoListApi' を使用して、アプリからユーザーの ToDo リストを読み書きできるようにする State 有効 [管理] で、[マニフェスト] を選択して API マニフェスト エディターを開きます。
accessTokenAcceptedVersion
プロパティを2
に設定します。[保存] を選択します。
Web API のアクセス許可を発行するときの最小限の特権の原則について説明します。
アプリ ロールを構成する
API は、クライアント アプリが自身としてアクセス トークンを取得できるように、アプリケーションに対して少なくとも 1 つのアプリ ロール (アプリケーションのアクセス許可とも呼ばれます) を発行する必要があります。 アプリケーションのアクセス許可は、クライアント アプリケーションが自身として正常に認証できるようにして、ユーザーをサインインさせる必要がないようにする場合に、API が発行するアクセス許可の種類です。 アプリケーションのアクセス許可を発行するには、次の手順に従います。
[アプリの登録] ページから、作成したアプリケーション (ciam-ToDoList-api など) を選択して、その [概要] ページを開きます。
[管理] で、[アプリ ロール] を選択します。
[アプリ ロールの作成] を選択し、次の値を入力し、[適用] を選択して変更を保存します:
プロパティ 先頭値 表示名 ToDoList.Read.All Allowed member types (許可されるメンバーの種類) アプリケーション 値 ToDoList.Read.All 説明 'ToDoListApi' を使用して、アプリがすべてのユーザーの ToDo リストを読むことができるようにする もう一度 [アプリ ロールの作成] を選択し、2 番目のアプリ ロールに次の値を入力し、[適用] を選択して変更を保存します:
プロパティ 先頭値 表示名 ToDoList.ReadWrite.All Allowed member types (許可されるメンバーの種類) アプリケーション 値 ToDoList.ReadWrite.All 説明 'ToDoListApi' を使用して、アプリがすべてのユーザーの ToDo リストを読み書きできるようにする
省略可能な要求の構成
オプションの idtyp 要求を使用すると、Web API がトークンがアプリ トークンなのかアプリ + ユーザー トークンなのかを判別しやすくなります。 scp および roles 要求の組み合わせは同じ目的に使用できますが、idtyp 要求の使用は、アプリ トークンとアプリ + ユーザー トークンを区別する最も簡単な方法です。 たとえば、トークンがアプリ専用トークンの場合、この要求の値は app です。
Android サンプル アプリに API のアクセス許可を付与する
クライアント アプリと Web API の両方を登録し、スコープを作成して API を公開したら、次の手順に従って、API に対するクライアントのアクセス許可を構成できます。
[アプリの登録] ページで、作成したアプリケーション ("ciam-client-app" など) を選択して、その [概要] ページを開きます。
[管理] の下にある [API のアクセス許可] を選択します。
[構成されたアクセス許可] の下で [アクセス許可の追加] を選択します。
[所属する組織で使用している API] タブを選択します。
API の一覧で、API (ciam-ToDoList-api など) を選択します。
[委任されたアクセス許可] オプションを選択します。
アクセス許可の一覧で [ToDoList.Read, ToDoList.ReadWrite] を選択します (必要に応じて検索ボックスを使用します)。
[アクセス許可の追加] ボタンを選択します
この時点で、アクセス許可が正しく割り当てられます。 ただし、このテナントは顧客のテナントであるため、コンシューマー ユーザー自身がこれらのアクセス許可に同意することはできません。 これに対処するには、管理者がテナント内のすべてのユーザーに代わってこれらのアクセス許可に同意する必要があります。
[<ご使用のテナント名> に管理者の同意を与えます] を選択してから、[はい] を選択します。
[最新の情報に更新] を選択し、両方のアクセス許可の [状態] に "<テナント名> に付与されました" と表示されていることを確認します。
[Configured permissions] (構成されたアクセス許可) の一覧でToDoList.Read と ToDoList.ReadWrite のアクセス許可を一度に 1 つずつ選択し、後で使用するためにアクセス許可の完全な URI をコピーします。 完全なアクセス許可 URI は、
api://{clientId}/{ToDoList.Read}
またはapi://{clientId}/{ToDoList.ReadWrite}
のようになります。
サンプル Web API を複製またはダウンロードする
サンプル アプリケーションを取得するには、GitHub から複製するか、.zip ファイルとしてダウンロードします。
サンプルをクローンするには、コマンド プロンプトを開き、プロジェクトを作成する場所に移動し、次のコマンドを入力します。
git clone https://github.com/Azure-Samples/ms-identity-ciam-dotnet-tutorial.git
.zip ファイルをダウンロードします。 名前の長さが 260 文字未満のファイル パスに抽出します。
サンプル Web API を構成して実行する
コード エディターで、
2-Authorization/1-call-own-api-aspnet-core-mvc/ToDoListAPI/appsettings.json
ファイルを開きます。次のプレースホルダーを見つけ、対応する操作を行います。
Enter_the_Application_Id_Here
。これを、前にコピーした Web API のアプリケーション (クライアント) ID に置き換えます。Enter_the_Tenant_Id_Here
。これを、前にコピーしたディレクトリ (テナント) ID に置き換えます。Enter_the_Tenant_Subdomain_Here
を、ディレクトリ (テナント) サブドメインに置き換えます。 たとえば、テナントのプライマリ ドメインがcontoso.onmicrosoft.com
の場合は、contoso
を使用します。 テナント名がない場合は、テナントの詳細を読み取る方法を確認してください。
これを呼び出すには、Android サンプル アプリ用の Web API をホストする必要があります。 クイック スタート: ASP.NET Web アプリをデプロイするに従って、Web API をデプロイします。
Web API を呼び出すサンプル Android モバイル アプリを構成する
このサンプルでは、複数の Web API URL エンドポイントとスコープ セットを構成できます。 この場合は、1 つの Web API URL エンドポイントとそれに関連付けられているスコープのみを構成します。
Android Studio で、
/app/src/main/java/com/azuresamples/msalnativeauthandroidkotlinsampleapp/AccessApiFragment.kt
ファイルを開きます。WEB_API_URL_1
という名前のプロパティを見つけ、URL を Web API に設定します。private const val WEB_API_URL_1 = "" // Developers should set the respective URL of their web API here
scopesForAPI1
という名前のプロパティを見つけ、「Android サンプル アプリに API のアクセス許可を付与する」で記録されたスコープを設定します。private val scopesForAPI1 = listOf<String>() // Developers should set the respective scopes of their web API here. For example, private val scopes = listOf<String>("api://{clientId}/{ToDoList.Read}", "api://{clientId}/{ToDoList.ReadWrite}")
Android サンプル アプリを実行して Web API を呼び出す
アプリをビルドして実行するには、次のステップに従います。
ツール バーの実行構成メニューからアプリを選択します。
ターゲット デバイス メニューで、アプリを実行するデバイスを選択します。
デバイスが構成されていない場合は、Android Emulator を使用するための Android 仮想デバイスを作成するか、物理デバイスを接続する必要があります。
[実行] ボタンを選択します。 メールとワンタイム パスコードの画面でアプリが開きます。
[API] タブを選択して API 呼び出しをテストします。 Web API の呼び出しが成功すると、HTTP
200
が返されますが、HTTP403
は未承認のアクセスを意味します。