Azure AD B2C を使用して サンプル Android アプリで認証オプションを構成する

この記事では、サンプルの Android アプリケーション (Kotlin および Java) を使用して、モバイル アプリに Azure Active Directory B2C (Azure AD B2C) 認証を追加する方法を説明します。

概要

OpenID Connect (OIDC) は、OAuth 2.0 を基盤にした認証プロトコルです。 OIDC を使用して、ユーザーを安全にアプリケーションにサインインさせることができます。 このモバイル アプリのサンプルでは、OIDC 認可コード PKCE フローで Microsoft Authentication Library (MSAL) を使用します。 MSAL は、モバイル アプリへの認証と認可サポートの追加を簡略化する、Microsoft 提供のライブラリです。

サインイン フローでは、次の手順が実行されます。

  1. ユーザーがアプリを開き、[サインイン] を選択します。
  2. アプリによってモバイル デバイスのシステム ブラウザーが開き、Azure AD B2C に対する認証要求が開始されます。
  3. ユーザーがサインアップまたはサインインパスワードのリセット、またはソーシャル アカウントを使用したサインインを行います。
  4. ユーザーがサインインに成功すると、Azure AD B2C からアプリに認可コードが返されます。
  5. アプリによって次のアクションが実行されます。
    1. 認可コードが、ID トークン、アクセス トークン、更新トークンと交換されます。
    2. ID トークン要求が読み取られます。
    3. 後で使用できるように、トークンがメモリ内キャッシュに格納されます。

アプリ登録の概要

アプリで Azure AD B2C を使用してサインインし、Web API を呼び出せるようにするには、Azure AD B2C ディレクトリに 2 つのアプリケーションを登録します。

  • モバイル アプリケーションの登録により、アプリでは Azure AD B2C を使用してサインインできるようになります。 アプリの登録時に、″リダイレクト URI″ を指定します。 リダイレクト URI は、ユーザーが Azure AD B2C で認証を行った後、Azure AD B2C によってリダイレクトされるエンドポイントです。 アプリの登録プロセスによって、モバイル アプリを一意に識別する "アプリケーション ID″ ("クライアント ID″ とも呼ばれる) が生成されます (たとえば "アプリ ID: 1″)。

  • Web API を登録すると、保護された Web API をアプリで呼び出すことができます。 この登録により、Web API のアクセス許可 (スコープ) が公開されます。 アプリの登録プロセスによって、Web API を一意に識別する "アプリケーション ID" が生成されます (たとえば "アプリ ID: 2")。 モバイル アプリ (App ID: 1) のアクセス許可を Web API スコープ (App ID: 2) に付与します。

アプリの登録とアプリケーションのアーキテクチャについて、次の図に示します。

Diagram of the mobile app with web API call registrations and tokens.

Web API の呼び出し

認証が完了した後、ユーザーがアプリと対話すると、保護された Web API が呼び出されます。 その Web API では、ベアラー トークン認証が使用されます。 ベアラー トークンは、アプリによって Azure AD B2C から取得されたアクセス トークンです。 アプリでは、HTTPS 要求の Authorization ヘッダーでトークンを渡します。

Authorization: Bearer <access token>

アクセス トークンのスコープが Web API のスコープと一致しない場合、認証ライブラリでは正しいスコープの新しいアクセス トークンが取得されます。

サインアウト フロー

サインアウト フローには、次の手順が含まれます。

  1. アプリから、ユーザーがサインアウトします。
  2. アプリによってそのセッション オブジェクトがクリアされ、認証ライブラリによってそのトークン キャッシュがクリアされます。
  3. アプリによってユーザーが Azure AD B2C サインアウト エンドポイントに移動し、Azure AD B2C セッションが終了されます。
  4. ユーザーが再びアプリにリダイレクトされます。

前提条件

次が実行されているコンピューター:

手順 1: ユーザー フローを構成する

ユーザーがアプリにサインインしようとすると、ユーザー フローを介した承認エンドポイントへの認証要求がアプリによって開始されます。 ユーザー フローによって、ユーザーのエクスペリエンスが定義および制御されます。 ユーザーがユーザー フローを完了すると、Azure AD B2C によってトークンが生成され、ユーザーはアプリケーションにリダイレクトされます。

ユーザー フローまたはカスタム ポリシーの作成をまだ行っていない場合は、作成します。 手順を繰り返して、次のように 3 つの個別のユーザー フローを作成します。

  • サインインと サインアップを結合したユーザー フロー (例:)susi。 このユーザー フローでは、パスワードを忘れた 場合のエクスペリエンスもサポート されています。
  • プロファイル編集 ユーザー フロー (例: edit_profile) 。
  • パスワードのリセット ユーザー フロー (例: reset_password)。

Azure AD B2C は、 B2C_1_ ユーザー フロー名の前に付加されます。 たとえば、susiB2C_1_susi になります。

手順 2: モバイル アプリケーションを登録する

モバイル アプリと Web API アプリケーションの登録を作成し、Web API のスコープを指定します。

手順 2.1: Web API アプリを登録する

Web API アプリの登録 (App ID: 2) を作成するには、次の手順に従います。

  1. Azure portal にサインインします。

  2. ご自分の Azure AD B2C テナントが含まれるディレクトリを必ず使用してください。 ポータル ツールバーの [Directories + subscriptions](ディレクトリ + サブスクリプション) アイコンを選択します。

  3. [ポータルの設定] | [Directories + subscriptions](ディレクトリ + サブスクリプション) ページの [ディレクトリ名] の一覧で自分の Azure AD B2C ディレクトリを見つけて、 [切り替え] を選択します。

  4. Azure portal で、 [Azure AD B2C] を検索して選択します。

  5. [アプリの登録] を選択し、 [新規登録] を選択します。

  6. アプリケーションの名前を入力します (my-api1 など)。 [リダイレクト URI][サポートされているアカウントの種類] を既定値のままにします。

  7. [登録] を選択します。

  8. アプリ登録が完了したら、 [概要] を選択します。

  9. アプリケーション (クライアント) ID の値を記録しておきます。これは、後で Web アプリケーションを構成するときに使用します。

    Screenshot that demonstrates how to get a web A P I application I D.

手順 2.2: Web API アプリのスコープを構成する

  1. 作成した my-api1 アプリケーション (App ID: 2) を選択して、その [概要] ページを開きます。

  2. [管理][API の公開] を選択します。

  3. [アプリケーション ID URI] の横にある [設定] リンクを選択します。 既定値 (GUID) を一意の名前 (例: tasks-api) に置き換え、[保存] を選択します。

    Web アプリケーションで Web API のアクセス トークンを要求するときに、API に対して定義する各スコープのプレフィックスとしてこの URI を追加する必要があります。

  4. [この API で定義されるスコープ] で、 [スコープの追加] を選択します。

  5. API への読み取りアクセスを定義するスコープを作成するには:

    1. [スコープ名]tasks.read を入力します。
    2. [管理者の同意の表示名] で、「Read access to tasks API」を入力します。
    3. [管理者の同意の説明] で、「Allows read access to the tasks API」を入力します。
  6. [スコープの追加] を選択します。

  7. [Add a scope (スコープの追加)] を選択し、API への書き込みアクセスを定義するスコープを追加します。

    1. [スコープ名] に「tasks.write」を入力します。
    2. [管理者の同意の表示名] に、「Write access to tasks API」を入力します。
    3. [管理者の同意の説明] に、「Allows write access to the tasks API」を入力します。
  8. [スコープの追加] を選択します。

手順 2.3: モバイル アプリを登録する

モバイル アプリの登録を作成するには、次の手順を実行します。

  1. Azure portal にサインインします。

  2. [アプリの登録] を選択し、 [新規登録] を選択します。

  3. [名前] には、アプリケーションの名前を入力します (たとえば android-app1)。

  4. [サポートされているアカウントの種類] で、 [Accounts in any identity provider or organizational directory (for authenticating users with user flows)]((ユーザー フローを使用してユーザーを認証するための) 任意の ID プロバイダーまたは組織のディレクトリのアカウント) を選択します。

  5. [リダイレクト URI] で、[パブリック クライアント/ネイティブ (モバイルとデスクトップ)] を選択してから、URL ボックスに次のいずれかの URI を入力します。

    • Kotlin サンプルの場合: msauth://com.azuresamples.msalandroidkotlinapp/1wIqXSqBj7w%2Bh11ZifsnqwgyKrY%3D
    • Java サンプルの場合: msauth://com.azuresamples.msalandroidapp/1wIqXSqBj7w%2Bh11ZifsnqwgyKrY%3D
  6. [登録] を選択します。

  7. アプリ登録が完了したら、 [概要] を選択します。

  8. アプリケーション (クライアント) ID を記録しておきます。これは、後でモバイル アプリケーションを構成するときに使用します。

    Screenshot highlighting the Android application ID

手順 2.4: Web API に対するアクセス許可をモバイル アプリに付与する

アプリ (アプリ ID: 1) にアクセス許可を付与するには、次の手順をおこないます。

  1. [アプリの登録] を選択し、作成したアプリを選択します (アプリ ID: 1)。

  2. [管理] の下にある [API のアクセス許可] を選択します。

  3. [構成されたアクセス許可] の下で [アクセス許可の追加] を選択します。

  4. [自分の API] タブを選択します。

  5. Web アプリケーションへのアクセス許可が必要な API を選択します (アプリ ID: 2)。 たとえば、「my-api1」と入力します。

  6. [アクセス許可] で、 [タスク] を展開し、前に定義したスコープを選択します(たとえば、tasks.readtasks.write)。

  7. [アクセス許可の追加] を選択します.

  8. [<テナント名> に管理者の同意を与えます] を選択します。

  9. [はい] を選択します。

  10. [最新の情報に更新] を選択し、両方のスコープの [状態] に、Granted for ...(... に付与されました) と表示されていることを確認します。

  11. [Configured permissions (構成済みのアクセス許可)] の一覧からスコープを選択し、スコープの完全な名前をコピーします。

    Screenshot of the configured permissions pane, showing that read access permissions are granted.

手順 3: Android モバイル アプリのサンプルを取得する

以下のいずれかを実行します。

  • 次のいずれかのサンプルをダウンロードします。

    サンプルの .zip ファイルを作業フォルダーに抽出します。

  • GitHub からサンプル Android モバイル アプリケーションをクローンします。

    git clone https://github.com/Azure-Samples/ms-identity-android-kotlin
    

手順 4: サンプル Web API を構成する

このサンプルでは、モバイル アプリが Web API に対して使用できる、関連するスコープを持つアクセス トークンを取得します。 コードから Web API を呼び出すには、次の手順を実行します。

  1. 既存の Web API を使用するか、新しいものを作成します。 詳細については、「Azure AD B2C を使用して独自の Web API で認証を有効にする」を参照してください。
  2. Web API を呼び出すようにサンプル コードを変更します。

手順 5: サンプル モバイル アプリを構成する

Android Studio またはその他のコード エディターでサンプル プロジェクトを開き、/app/src/main/res/raw/auth_config_b2c.json ファイルを開きます。

auth_config_b2c.json 構成ファイルには、Azure AD B2C ID プロバイダーに関する情報が含まれています。 モバイル アプリでは、この情報を使用して Azure AD B2C との信頼関係を確立し、ユーザーのサインインとサインアウトを行い、トークンを取得して検証します。

次のアプリ設定のプロパティを更新します。

キー 先頭値
client_id 手順 2.3 のモバイル アプリケーション ID。
redirect_uri 手順 2.3 のモバイル アプリケーション リダイレクト URI。
authorities 機関は、MSAL がトークンを要求できるディレクトリを示す URL です。 次の形式を使用します: https://<your-tenant-name>.b2clogin.com/<your-tenant-name>.onmicrosoft.com/<your-sign-in-sign-up-policy><your-tenant-name> を Azure AD B2C のテナント名に置き換えます。 次に、<your-sign-in-sign-up-policy> を、手順 1 で作成したユーザー フローまたはカスタム ポリシーに置き換えます。

B2CConfiguration クラスを開き、次のクラス メンバーを更新します。

キー
ポリシー 手順 1 で作成したユーザー フローまたはカスタム ポリシーの一覧。
azureAdB2CHostName Azure AD B2C テナント名の最初の部分 (例: https://contoso.b2clogin.com)。
tenantName Azure AD B2C テナントの完全なテナント名 (例: contoso.onmicrosoft.com)。
スコープ 手順 2.4 で作成した Web API スコープ。

手順 6: モバイル アプリを実行してテストする

  1. プロジェクトをビルドして実行します。

  2. 以下のような、左上にあるハンバーガー アイコン (折りたたまれたメニュー) を選択します。

    Screenshot highlighting the hamburger, or collapsed menu, icon.

  3. 左側のペインで、[B2C モード] を選択します。

    Screenshot highlighting the

  4. [ユーザー フローを実行します] を選択します。

    Screenshot highlighting the

  5. Azure AD B2C のローカルまたはソーシャル アカウントを使用してサインアップまたはサインインします。

  6. 認証が成功すると、[B2C モード] ペインに表示名が表示されます。

    Screenshot showing a successful authentication, with signed-in user and policy displayed.

次のステップ

具体的には、次の方法を学習します。