重要
2025 年 5 月 1 日より、Azure AD B2C は新規のお客様向けに購入できなくなります。 詳細については、FAQ を参照してください。
開始する前にこのページの上部にある ポリシーの種類 セレクターを使用して、設定するポリシーの種類を選択します。 Azure Active Directory B2C には、ユーザーがアプリケーションを操作する方法を定義する 2 つの方法 (定義済みのユーザー フローを使用する、または完全に構成可能なカスタム ポリシーを使用する) があります。 この記事で必要な手順は、方法ごとに異なります。
OAuth 2.0 クライアント資格情報付与フローでは、アプリ (機密クライアント) は、REST API などの Web リソースを呼び出すときに、ユーザーを偽装するのではなく、独自の資格情報を使用して認証することを許可します。 この種類の許可は、バックグラウンドでの実行が必要なサーバー間の相互作用に使用され、ユーザーとの即時の相互動作は必要ありません。 これらの種類のアプリケーションは、多くの場合、デーモンまたはサービス アカウントと呼ばれます。
クライアント資格情報フローでは、アクセス許可は管理者によってアプリケーション自体に直接付与されます。 アプリがリソースにトークンを提示すると、認証に関係するユーザーがいないため、リソースはアプリ自体がアクションを実行する承認を持っていることを強制します。 この記事では、API を呼び出すためにアプリケーションを承認するために必要な手順と、その API を呼び出すために必要なトークンを取得する方法について説明します。
注
この機能はパブリック プレビュー段階です。
アプリ登録の概要
アプリでクライアント資格情報を使用してサインインできるようにするには、Web API を呼び出し、Azure AD B2C ディレクトリに 2 つのアプリケーションを登録します。
アプリケーションの登録により、アプリは Azure AD B2C でサインインできます。 アプリの登録プロセスによって、アプリを一意に識別する "アプリケーション ID" ("クライアント ID" とも呼ばれます) が生成されます。 また、トークンを安全に取得するためにアプリによって使用される、"クライアント シークレット" を作成します。
Web API の登録により、アプリではセキュリティで保護された Web API を呼び出すことができます。 登録には、Web API の "スコープ" が含まれます。 スコープを使用することで、Web API などの保護されたリソースへのアクセス許可を管理できます。 次に、アプリケーションに Web API スコープへのアクセス許可を付与します。 アクセス トークンが要求されると、アプリは要求の
.default
スコープ パラメーターを指定します。 Azure AD B2C は、アプリに付与された Web API スコープを返します。
アプリのアーキテクチャと登録について、次の図に示します。
手順 1: Web API アプリを登録する
この手順では、Web API (アプリ 2) をスコープに登録します。 その後、アプリケーション (アプリ 1) にそれらのスコープへのアクセス許可を付与します。 このようなアプリの登録が既にある場合は、この手順をスキップしてから、次の 手順 1.1 Web API ロール (スコープ) を定義します。
Web API アプリの登録 (App ID: 2) を作成するには、次の手順に従います。
Azure portal にサインインします。
ご自分の Azure AD B2C テナントが含まれるディレクトリを必ず使用してください。 ポータル ツールバーの [Directories + subscriptions](ディレクトリ + サブスクリプション) アイコンを選択します。
[ポータルの設定] | [Directories + subscriptions](ディレクトリ + サブスクリプション) ページの [ディレクトリ名] の一覧で自分の Azure AD B2C ディレクトリを見つけて、 [切り替え] を選択します。
Azure portal で、 [Azure AD B2C] を検索して選択します。
[アプリの登録] を選択し、[新しい登録] を選択します。
アプリケーションの名前を入力します (my-api1 など)。 [リダイレクト URI] と [サポートされているアカウントの種類] を既定値のままにします。
登録 を選択します。
アプリ登録が完了したら、 [概要] を選択します。
アプリケーション (クライアント) ID の値を記録しておきます。これは、後で Web アプリケーションを構成するときに使用します。
手順 1.1 Web API ロール (スコープ) を定義する
この手順では、Web API アプリケーション ID URI を構成し、 アプリ ロールを定義します。 アプリ "ロール" は、OAuth 2.0 の "スコープ" で使用され、API を表すアプリケーションの登録で定義されます。 アプリケーションは、 .default
スコープのアプリケーション ID URI を使用します。 アプリロールを定義するには、次の手順に従います。
my-api1 など、作成した Web API を選択します。
[ 管理] で、[ API の公開] を選択します。
[アプリケーション ID URI] の横にある [設定] リンクを選択します。 既定値 (GUID) を一意の名前 ( api など) に置き換え、[保存] を選択 します。
アプリケーション ID URI をコピーします。 次のスクリーンショットは、アプリケーション ID URI をコピーする方法を示しています。
[ 管理] で [ マニフェスト ] を選択し、アプリケーション マニフェスト エディターを開きます。 エディターで、
appRoles
設定を見つけて、applications
を対象とするアプリ ロールを定義します。 各アプリケーションのロール定義には、そのid
値に対して一意のグローバル識別子 (GUID) が必要です。 Microsoft PowerShell またはオンライン GUID ジェネレーターでnew-guid
command を実行して、新しい GUID を生成します。 各アプリ ロール定義のvalue
プロパティは、スコープ (scp
要求) に表示されます。value
プロパティにはスペースを含めることはできません。 次の例では、読み取りと書き込みの 2 つのアプリ ロールを示します。"appRoles": [ { "allowedMemberTypes": ["Application"], "displayName": "Read", "id": "d6a15e20-f83c-4264-8e61-5082688e14c8", "isEnabled": true, "description": "Readers have the ability to read tasks.", "value": "app.read" }, { "allowedMemberTypes": ["Application"], "displayName": "Write", "id": "204dc4ab-51e1-439f-8c7f-31a1ebf3c7b9", "isEnabled": true, "description": "Writers have the ability to create tasks.", "value": "app.write" }],
ページの上部にある [ 保存] を選択してマニフェストの変更を保存します。
手順 2: アプリケーションを登録する
クライアント資格情報フローを使用してアプリが Azure AD B2C でサインインできるようにするには、既存のアプリケーションを使用するか、新しいアプリケーション (アプリ 1) を登録します。
既存のアプリを使用している場合は、アプリの accessTokenAcceptedVersion
が 2
に設定されていることを確認します。
- Azure portal で、 [Azure AD B2C] を検索して選択します。
- [ アプリの登録] を選択し、一覧から既存のアプリを選択します。
- 左側のメニューの [ 管理] で、[ マニフェスト ] を選択してマニフェスト エディターを開きます。
-
accessTokenAcceptedVersion
要素を見つけて、その値を2
に設定します。 - ページの上部にある [ 保存] を選択して変更を保存します。
新しい Web アプリ登録を作成するには、次の手順に従います。
Azure portal で、Azure AD B2C を検索して選択します
[アプリの登録] を選択し、[新しい登録] を選択します。
アプリケーションの名前を入力します。 たとえば、 ClientCredentials_app。
他の値はそのままにして、[ 登録] を選択します。
後の手順で使用する アプリケーション (クライアント) ID を 記録します。
手順 2.1 クライアント シークレットを作成する
登録したアプリケーションに対してクライアント シークレットを作成します。 アプリは、クライアント シークレットを使用して、トークンを要求するときにその ID を証明します。
[管理] で、[証明書とシークレット] を選択します。
新しいクライアント シークレットを選択します。
[ 説明 ] ボックスに、クライアント シークレットの説明 ( clientsecret1 など) を入力します。
[有効期限] で、シークレットが有効な期間を選択してから、 [追加] を選択します。
シークレットの値を記録します。 この値は、後の手順で構成に使用します。
手順 2.2 Web API のアクセス許可をアプリに付与する
アプリ (アプリ 1) のアクセス許可を付与するには、次の手順に従います。
[ アプリの登録] を選択し、作成したアプリ (アプリ 1) を選択します。
[管理] で API 許可を選択します。
[構成されたアクセス許可] の下で [アクセス許可の追加] を選択します。
[ マイ API ] タブを選択します。
Web アプリケーションにアクセスを許可する API (アプリ 2) を選択します。 たとえば、「my-api1」と入力します。
[ アプリケーションのアクセス許可] を選択します。
[アクセス許可] でアプリを展開し、前に定義したスコープ (app.read や app.write など) を選択します。
アクセス許可の追加 を選択します。
[<テナント名> に管理者の同意を与えます] を選択します。
[はい] を選択します。
[最新の情報に更新] を選択し、両方のスコープの [状態] に、Granted for ...(... に付与されました) と表示されていることを確認します。
手順 3: アクセス トークンを取得する
ユーザー フローまたはカスタム ポリシーに対してクライアント資格情報を有効にする特定のアクションはありません。 Azure AD B2C ユーザー フローとカスタム ポリシーの両方で、クライアント資格情報フローがサポートされます。 まだ作成していない場合は、 ユーザー フローまたはカスタム ポリシーを作成します。 次に、お気に入りの API 開発アプリケーションを使用して、承認要求を生成します。 次の情報を POST 要求の本文として使用して、次の例のような呼び出しを作成します。
https://<tenant-name>.b2clogin.com/<tenant-name>.onmicrosoft.com/<policy>/oauth2/v2.0/token
-
<tenant-name>
を Azure AD B2C テナントの名前に置き換えます。 たとえば、contoso.b2clogin.com
のようにします。 -
<policy>
を、ユーザー フローの完全な名前またはカスタム ポリシーに置き換えます。 すべての種類のユーザー フローとカスタム ポリシーは、クライアント資格情報フローをサポートします。 持っている任意のユーザー フローまたはカスタム ポリシーを使用することも、サインアップやサインインなどの新しいポリシーを作成することもできます。
鍵 | 価値 |
---|---|
grant_type(グラントタイプ) | client_credentials |
クライアントID | 手順 2 の「アプリケーションの登録」からのクライアント ID。 |
クライアントシークレット | 手順 2.1 クライアント シークレットの作成 からの クライアント シークレットの値。 |
範囲 | 手順 1.1 の アプリケーション ID URI では、 Web API ロール (スコープ) と .default を定義します。 たとえば、 https://contoso.onmicrosoft.com/api/.default や https://contoso.onmicrosoft.com/00001111-aaaa-2222-bbbb-3333cccc4444/.default などです。 |
実際の POST 要求は次の例のようになります。
要求:
POST /<tenant-name>.onmicrosoft.com/B2C_1A_SUSI/oauth2/v2.0/token HTTP/1.1
Host: <tenant-name>.b2clogin.com
Content-Type: application/x-www-form-urlencoded
grant_type=client_credentials
&client_id=11112222-bbbb-3333-cccc-4444dddd5555
&client_secret=FyX7Q~DuPJ...
&scope=https%3A%2F%2Fcontoso.onmicrosoft.com%2Fapi%2F.default
応答:
{
"access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImtpZCI6IlBFcG5OZDlnUkNWWUc2dUs...",
"token_type": "Bearer",
"not_before": 1645172292,
"expires_in": 3600,
"expires_on": 1645175892,
"resource": "11112222-bbbb-3333-cccc-4444dddd5555"
}
リターン アクセス トークン 要求について説明します。 次の表に、クライアント資格情報フローに関連する要求を示します。
主張 | 説明 | 価値 |
---|---|---|
aud |
トークンの受信者を示します。 | API の クライアント ID 。 |
sub |
サービス プリンシパルは、要求を開始したアプリケーションに関連付けられます。 | これは、認可要求の client_id のサービス プリンシパルです。 |
azp |
承認されたパーティ - アクセス トークンが発行されたパーティ。 | 要求を開始したアプリケーションの クライアント ID 。 これは、承認要求の client_id で指定した値と同じです。 |
scp |
アプリケーション API によって公開されるスコープのセット (スペース区切り記号)。 | クライアント資格情報フローでは、承認要求は .default スコープを要求しますが、トークンには API によって公開された (およびアプリ管理者が同意した) スコープの一覧が含まれます。 たとえば、app.read app.write のようにします。 |
手順 3.1 スクリプトを使用してアクセス トークンを取得する
構成をテストするには、次の PowerShell スクリプトを使用します。
$appId = "<client ID>"
$secret = "<client secret>"
$endpoint = "https://<tenant-name>.b2clogin.com/<tenant-name>.onmicrosoft.com/<policy>/oauth2/v2.0/token"
$scope = "<Your API id uri>/.default"
$body = "grant_type=client_credentials&scope=" + $scope + "&client_id=" + $appId + "&client_secret=" + $secret
$token = Invoke-RestMethod -Method Post -Uri $endpoint -Body $body
構成をテストするには、次の cURL スクリプトを使用します。
curl --___location --request POST 'https://<your-tenant>.b2clogin.com/<your-tenant>.onmicrosoft.com/<policy>/oauth2/v2.0/token' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--form 'grant_type="client_credentials"' \
--form 'client_id="<client ID>"' \
--form 'client_secret="<client secret>"' \
--form 'scope="<Your API id uri>/.default"'
手順 4: トークンをカスタマイズする
この機能は、カスタム ポリシーでのみ使用できます。 セットアップ手順については、前のセレクターで [カスタム ポリシー] を選択します。
カスタム ポリシーは、トークン発行プロセスを拡張する方法を提供します。 OAuth 2.0 クライアント資格情報のユーザー体験をカスタマイズするには、 ガイダンスに従ってクライアント資格情報のユーザー体験を構成します。 次に、 JwtIssuer
技術プロファイルで、作成したユーザー体験への参照を含む ClientCredentialsUserJourneyId
メタデータを追加します。
次の例は、トークン発行者の技術プロファイルに ClientCredentialsUserJourneyId
を追加する方法を示しています。
<TechnicalProfile Id="JwtIssuer">
<Metadata>
<Item Key="ClientCredentialsUserJourneyId">ClientCredentialsJourney</Item>
</Metadata>
</TechnicalProfile>
次の例は、クライアント資格情報のユーザー体験を示しています。 最初と最後のオーケストレーション手順が必要です。
<UserJourneys>
<UserJourney Id="ClientCredentialsJourney">
<OrchestrationSteps>
<!-- [Required] Do the client credentials -->
<OrchestrationStep Order="1" Type="ClaimsExchange">
<ClaimsExchanges>
<ClaimsExchange Id="ClientCredSetupExchange" TechnicalProfileReferenceId="ClientCredentials_Setup" />
</ClaimsExchanges>
</OrchestrationStep>
<!-- [Optional] Call a REST API or claims transformation -->
<OrchestrationStep Order="2" Type="ClaimsExchange">
<ClaimsExchanges>
<ClaimsExchange Id="TokenAugmentation" TechnicalProfileReferenceId="TokenAugmentation" />
</ClaimsExchanges>
</OrchestrationStep>
<!-- [Required] Issue the access token -->
<OrchestrationStep Order="3" Type="SendClaims" CpimIssuerTechnicalProfileReferenceId="JwtIssuer" />
</OrchestrationSteps>
</UserJourney>
</UserJourneys>