次の方法で共有


Azure Active Directory B2C を使用してサンプルの Angular シングルページ アプリケーションで認証を構成する

重要

2025 年 5 月 1 日より、Azure AD B2C は新規のお客様向けに購入できなくなります。 詳細については、FAQ を参照してください

この記事では、サンプルの Angular シングルページ アプリケーション (SPA) を使用して、Azure Active Directory B2C (Azure AD B2C) 認証を Angular アプリに追加する方法を説明します。

概要

OpenID Connect (OIDC) は OAuth 2.0 を基盤とした認証プロトコルであり、ユーザーをアプリケーションに安全にサインインさせるために利用できます。 この Angular サンプルでは、 MSAL AngularMSAL Browser を使用します。 MSAL は、Angular SPA への認証と承認のサポートの追加を簡略化する Microsoft 提供のライブラリです。

サインイン フロー

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

  1. ユーザーがアプリを開き、[ サインイン] を選択します。
  2. アプリは認証要求を開始し、ユーザーを Azure AD B2C にリダイレクトします。
  3. ユーザーが サインアップまたはサインイン して パスワードをリセットするか、 ソーシャル アカウントでサインインします。
  4. サインインが成功すると、Azure AD B2C はアプリに承認コードを返します。 アプリは次のアクションを実行します。
    1. ID トークン、アクセス トークン、および更新トークンの承認コードを交換します。
    2. ID トークン クレームを読み取る。
    3. 後で使用できるように、アクセス トークンと更新トークンをメモリ内キャッシュに格納します。 アクセス トークンを使用すると、ユーザーは Web API などの保護されたリソースを呼び出すことができます。 更新トークンは、新しいアクセス トークンを取得するために使用されます。

アプリの登録

アプリが Azure AD B2C でサインインして Web API を呼び出せるようにするには、Azure AD B2C テナントに次の 2 つのアプリケーションを登録する必要があります。

  • シングルページ アプリケーション (Angular) の登録により、アプリは Azure AD B2C でサインインできます。 アプリの登録時に、 リダイレクト URI を指定します。 リダイレクト URI は、ユーザーが Azure AD B2C で認証された後にリダイレクトされるエンドポイントです。 アプリ登録プロセスは、アプリを一意に識別するアプリケーション ID (またはクライアント ID として知られています) を生成します。 この記事では、 アプリ ID の例 1 を使用します。

  • Web API 登録を使用すると、アプリは保護された Web API を呼び出します。 登録により、Web API のアクセス許可 (スコープ) が公開されます。 アプリ登録プロセスでは、Web API を一意に識別するアプリケーション ID が生成されます。 この記事では、 アプリ ID の例 2 を使用します。 Web API スコープ (アプリ ID: 2) にアプリ (アプリ ID: 1) のアクセス許可を付与します。

次の図では、アプリの登録とアプリのアーキテクチャについて説明します。

Web A P I、登録、トークンを含むシングルページ アプリケーションを説明する図。

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: Angular SPA と API を登録する

この手順では、Angular SPA と 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 アプリケーションを構成するときに使用します。

    Web A P I アプリケーション ID の取得方法を示すスクリーンショット。

2.2 スコープを構成する

  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 Angular アプリを登録する

Angular アプリの登録を作成するには、次の手順に従います。

  1. Azure portal にサインインします。
  2. 複数のテナントにアクセスできる場合、上部のメニューの [設定] アイコンを選択し、[ディレクトリとサブスクリプション] メニューからお使いの Azure AD B2C テナントに切り替えます。
  3. Azure portal で、 [Azure AD B2C] を検索して選択します。
  4. [アプリの登録] を選択し、[新しい登録] を選択します。
  5. [名前] にアプリケーションの名前を入力します。 たとえば、「 MyApp」と入力します。
  6. [サポートされているアカウントの種類] で、[(ユーザー フローを使用してユーザーを認証するための) 任意の ID プロバイダーまたは組織のディレクトリのアカウント] を選択します。
  7. [ リダイレクト URI] で[ シングルページ アプリケーション (SPA)]を選択し、[URL] ボックスに「 http://localhost:4200 」と入力します。
  8. [アクセス許可] で、 [Grant admin consent to openid and offline access permissions](OpenID とオフラインのアクセス許可に管理者の同意を与える) チェック ボックスをオンにします。
  9. 登録 を選択します。
  10. 後の手順で Web アプリケーションを構成するときに使用するアプリケーション (クライアント) ID の値を記録します。 Angular アプリケーション ID を取得する方法を示すスクリーンショット。

2.5 アクセス許可を付与する

アプリ (アプリ 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 (構成済みのアクセス許可)] の一覧からスコープを選択し、スコープの完全な名前をコピーします。

    読み取りアクセス許可が付与されたことを示す、[Configured permissions (構成済みのアクセス許可)] ペインのスクリーンショット。

手順 3: Angular サンプル コードを取得する

このサンプルでは、Angular シングルページ アプリケーションでユーザーのサインアップとサインインに Azure AD B2C を使用する方法を示します。 その後、アプリではアクセス トークンを取得して、保護された Web API を呼び出します。

サンプルの .zip ファイルをダウンロードするか、次のコマンドを使用して GitHub リポジトリからサンプルを複製します。

git clone https://github.com/Azure-Samples/ms-identity-javascript-angular-tutorial.git

3.1 Angular サンプルを構成する

SPA サンプルを入手したら、Azure AD B2C と Web API の値でコードを更新します。 サンプル フォルダーの src/app フォルダーで、 auth-config.ts ファイルを開きます。 対応する値でキーを更新します。

セクション 価値
b2cポリシー 手順 1 で作成したユーザー フローまたはカスタム ポリシー。
b2cポリシー 官憲 your-tenant-nameを Azure AD B2C テナント名に置き換えます。 たとえば、 contoso.onmicrosoft.comを使用します。 次に、ポリシー名を 、手順 1 で作成したユーザー フローまたはカスタム ポリシーに置き換えます。 たとえば、 https://<your-tenant-name>.b2clogin.com/<your-tenant-name>.onmicrosoft.com/<your-sign-in-sign-up-policy>と指定します。
b2cポリシー authorityドメイン Azure AD B2C のテナント名。 たとえば、 contoso.onmicrosoft.comと指定します。
コンフィギュレーション クライアントID 手順 2.3 の Angular アプリケーション ID。
保護されたリソース エンドポイント Web API の URL: http://localhost:5000/api/todolist
保護されたリソース スコープ 手順 2.2 で作成した Web API スコープ。 たとえば、 b2cScopes: ["https://<your-tenant-name>.onmicrosoft.com/tasks-api/tasks.read"]と指定します。

結果として得られる src/app/auth-config.ts コードは、次のサンプルのようになります。

export const b2cPolicies = {
     names: {
         signUpSignIn: "b2c_1_susi_reset_v2",
         editProfile: "b2c_1_edit_profile_v2"
     },
     authorities: {
         signUpSignIn: {
             authority: "https://your-tenant-name.b2clogin.com/your-tenant-name.onmicrosoft.com/b2c_1_susi_reset_v2",
         },
         editProfile: {
             authority: "https://your-tenant-name.b2clogin.com/your-tenant-name.onmicrosoft.com/b2c_1_edit_profile_v2"
         }
     },
     authorityDomain: "your-tenant-name.b2clogin.com"
 };
 
 
export const msalConfig: Configuration = {
     auth: {
         clientId: '<your-MyApp-application-ID>',
         authority: b2cPolicies.authorities.signUpSignIn.authority,
         knownAuthorities: [b2cPolicies.authorityDomain],
         redirectUri: '/', 
     },
    // More configuration here
 }

export const protectedResources = {
  todoListApi: {
    endpoint: "http://localhost:5000/api/todolist",
    scopes: ["https://your-tenant-namee.onmicrosoft.com/api/tasks.read"],
  },
}

手順 4: Web API のサンプル コードを取得する

Web API を登録し、そのスコープを定義したので、Azure AD B2C テナントで動作するように Web API コードを構成します。

*.zip アーカイブをダウンロードするか、GitHub からサンプル Web API プロジェクトを複製します。 次のコマンドを使用して、GitHub 上 の Azure-Samples/active-directory-b2c-javascript-nodejs-webapi プロジェクトを直接参照することもできます。

git clone https://github.com/Azure-Samples/active-directory-b2c-javascript-nodejs-webapi.git

4.1 Web API を構成する

サンプル フォルダーで、 config.json ファイルを開きます。 このファイルには、Azure AD B2C ID プロバイダーに関する情報が含まれています。 Web API アプリは、この情報を使用して、Web アプリがベアラー トークンとして渡すアクセス トークンを検証します。 アプリ設定の次のプロパティを更新します。

セクション 価値
資格情報 テナント名 Azure AD B2C テナント名の最初の部分。 たとえば、 contosoと指定します。
資格情報 クライアントID 手順 2.1 の Web API アプリケーション ID。 前の では、 アプリ ID が 2 のアプリケーションです。
資格情報 発行者 (省略可能) トークン発行者のクレーム値 iss。 既定では、Azure AD B2C はトークンを次の形式で返します: https://<your-tenant-name>.b2clogin.com/<your-tenant-ID>/v2.0/<your-tenant-name>を Azure AD B2C テナント名の最初の部分に置き換えます。 <your-tenant-ID>Azure AD B2C テナント ID に置き換えます。
ポリシー ポリシー名 手順 1 で作成したユーザー フローまたはカスタム ポリシー。 アプリケーションで複数のユーザー フローまたはカスタム ポリシーを使用する場合は、1 つだけを指定します。 たとえば、サインアップまたはサインイン ユーザー フローを使用します。
リソース 範囲 手順 2.5 の Web API アプリケーション登録のスコープ。

最終的な構成ファイルは、次の JSON のようになります。

{
    "credentials": {
        "tenantName": "<your-tenant-name>",
        "clientID": "<your-webapi-application-ID>",
        "issuer": "https://<your-tenant-name>.b2clogin.com/<your-tenant-ID>/v2.0/"
    },
    "policies": {
        "policyName": "b2c_1_susi"
    },
    "resource": {
        "scope": ["tasks.read"] 
    },
    // More settings here
} 

手順 5: Angular SPA と Web API を実行する

これで、API への Angular スコープ アクセスをテストする準備ができました。 この手順では、ローカル コンピューターで Web API とサンプル Angular アプリケーションの両方を実行します。 次に、Angular アプリケーションにサインインし、 TodoList ボタンを選択して、保護された API への要求を開始します。

Web API を実行する

  1. コンソール ウィンドウを開き、Web API サンプルを含むディレクトリに移動します。 例えば次が挙げられます。

    cd active-directory-b2c-javascript-nodejs-webapi
    
  2. 次のコマンドを実行してください:

    npm install && npm update
    node index.js
    

    コンソール ウィンドウに、アプリケーションがホストされているポート番号が表示されます。

    Listening on port 5000...
    

Angular アプリケーションを実行する

  1. 別のコンソール ウィンドウを開き、Angular サンプルを含むディレクトリに移動します。 例えば次が挙げられます。

    cd ms-identity-javascript-angular-tutorial-main/3-Authorization-II/2-call-api-b2c/SPA
    
  2. 次のコマンドを実行してください:

    npm install && npm update
    npm start
    

    コンソール ウィンドウには、アプリケーションがホストされているポート番号が表示されます。

    Listening on port 4200...
    
  3. ブラウザーで http://localhost:4200 に移動して、アプリケーションを表示します。

  4. [ ログイン] を選択します

    ログイン リンクを含む Angular サンプル アプリを示すスクリーンショット。

  5. サインインアップまたはサインイン プロセスを完了します。

  6. サインインに成功すると、プロファイルが表示されます。 メニューから TodoList を選択します。

    ユーザー プロファイルを含む Angular サンプル アプリと、to-do リストの呼び出しを示すスクリーンショット。

  7. [ 追加] を選択して新しい項目をリストに追加するか、アイコンを使用してアイテムを削除または編集します。

    to-do リストに対する Angular サンプル アプリの呼び出しを示すスクリーンショット。

アプリケーションをデプロイする

運用アプリケーションでは、通常、アプリ登録のリダイレクト URI は、 https://contoso.comなど、アプリが実行されているパブリックにアクセス可能なエンドポイントです。

お使いの登録済みアプリケーションでは、いつでもリダイレクト URI を追加したり、変更したりすることができます。 リダイレクト URI には、次の制限があります。

  • 応答 URL は、スキーム https で始まる必要があります。
  • 応答 URL では大文字と小文字が区別されます。 大文字と小文字の区別は、実行中のアプリケーションの URL パスの場合と一致している必要があります。