次の方法で共有


Azure Active Directory B2C カスタム ポリシーを使用して REST API を呼び出す

重要

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

Azure Active Directory B2C (Azure AD B2C) カスタム ポリシーを使用すると、Azure AD B2C の外部で実装するアプリケーション ロジックを操作できます。 これを行うには、エンドポイントへの HTTP 呼び出しを行います。 Azure AD B2C カスタム ポリシーは、この目的のために RESTful 技術プロファイルを提供します。 この機能を使用すると、Azure AD B2C カスタム ポリシー内では使用できない機能を実装できます。

この記事では、次の方法について説明します。

  • RESTful サービスとして使用するサンプル Node.js アプリを作成してデプロイします。

  • RESTful 技術プロファイルを使用して、Node.js RESTful サービスへの HTTP 呼び出しを行います。

  • RESTful サービスがカスタム ポリシーに返すエラーを処理または報告します。

シナリオの概要

Azure AD B2C カスタム ポリシーを使用したユーザー体験での分岐の作成では、個人用アカウントを選択したユーザーは、有効な招待アクセス コードを指定して続行する必要があります。 静的アクセス コードを使用していますが、実際のアプリはこの方法では機能しません。 アクセス コードを発行するサービスがカスタム ポリシーの外部にある場合は、そのサービスを呼び出し、検証のためにユーザーが入力したアクセス コードを渡す必要があります。 アクセス コードが有効な場合、サービスは HTTP 200 OK 応答を返し、Azure AD B2C は JWT を発行します。 それ以外の場合、サービスは HTTP 4xx 応答を返し、ユーザーはアクセス コードを再入力する必要があります。

R E S T A P Iを呼び出すフローチャート。

前提条件

この記事は、 Azure Active Directory B2C での独自のカスタム ポリシーの作成と実行に関するハウツー ガイド シリーズの一部です。 最初の記事からこのシリーズを開始することをお勧めします。

手順 1 - Node.js アプリを作成してデプロイする

外部アプリとして機能するアプリをデプロイする必要があります。 その後、カスタム ポリシーによって、このアプリへの HTTP 呼び出しが行われます。

手順 1.1 - Node.js アプリを作成する

  1. access-code-appなど、ノード アプリケーションをホストするフォルダーを作成します。

  2. ターミナルで、 cd access-code-appなどの Node アプリ フォルダーにディレクトリを変更し、 npm init -y実行します。 このコマンドは、Node.js プロジェクトの既定の package.json ファイルを作成します。

  3. ターミナルで、npm install express body-parser を実行します。 このコマンドは、Express フレームワークと ボディ パーサー パッケージをインストールします。

  4. プロジェクトで、 index.js ファイルを作成します。

  5. VS Code で、 index.js ファイルを開き、次のコードを追加します。

        const express = require('express');
        let bodyParser = require('body-parser')
        //Create an express instance
        const app = express();
    
        app.use( bodyParser.json() );       // to support JSON-encoded bodies
        app.use(bodyParser.urlencoded({     // to support URL-encoded bodies
          extended: true
        }));
    
    
        app.post('/validate-accesscode', (req, res) => {
            let accessCode = '88888';
            if(accessCode == req.body.accessCode){
                res.status(200).send();
            }else{
                let errorResponse = {
                    "version" :"1.0",
                    "status" : 409,
                    "code" : "errorCode",
                    "requestId": "requestId",
                    "userMessage" : "The access code you entered is incorrect. Please try again.",
                    "developerMessage" : `The provided code ${req.body.accessCode} does not match the expected code for user.`,
                    "moreInfo" :"https://learn.microsoft.com/en-us/azure/active-directory-b2c/string-transformations"
                };
                res.status(409).send(errorResponse);                
            }
        });
    
        app.listen(80, () => {
            console.log(`Access code service listening on port !` + 80);
        });
    

    ユーザーが間違ったアクセス コードを送信すると、REST API から直接エラーを返すことができることを確認できます。 カスタム ポリシーを使用すると、HTTP 4xx エラー メッセージ (400 (無効な要求)、または 409 (競合) の応答状態コードなど) を返し、応答 JSON 本文 errorResponse 変数に示すように書式設定できます。 アプリ内の accessCode のソースをデータベースから読み取る可能性があります。 検証エラー メッセージの返却についてさらに詳しく知る。

  6. アプリが期待どおりに動作することをテストするには、次の手順を使用します。

    1. ターミナルで、 node index.js コマンドを実行してアプリ サーバーを起動します。
    2. この例に示すような POST 要求を行うには、 Microsoft PowerShell などの HTTP クライアントを使用できます。
        POST http://localhost/validate-accesscode HTTP/1.1
        Host: localhost
        Content-Type: application/x-www-form-urlencoded
    
        accessCode=user-code-code
    

    user-code-codeを、54321などのユーザーによるアクセス コード入力に置き換えます。 PowerShell を使用している場合は、次のスクリプトを実行します。

        $accessCode="54321"
        $endpoint="http://localhost/validate-accesscode"
        $body=$accessCode
        $response=Invoke-RestMethod -Method Post -Uri $endpoint -Body $body
        echo $response
    

    正しくないアクセス コードを使用する場合、応答は次の JSON スニペットのようになります。

        {
            "version": "1.0",
            "status": 409,
            "code": "errorCode",
            "requestId": "requestId",
            "userMessage": "The access code you entered is incorrect. Please try again.",
            "developerMessage": "The provided code 54321 does not match the expected code for user.",
            "moreInfo": "https://learn.microsoft.com/en-us/azure/active-directory-b2c/string-transformations"
        }
    

REST サービスは HTTP 4xx 状態コードを返すことができますが、JSON 応答の status の値は 409する必要があります。

この時点で、Node.js アプリをデプロイする準備ができました。

手順 1.2 - Azure App Service に Node.js アプリをデプロイする

カスタム ポリシーが Node.js アプリに到達するには、アクセス可能である必要があるため、デプロイする必要があります。 この記事では、 Azure App Service を使用してアプリをデプロイしますが、別のホスティング アプローチを使用します。

アプリを Azure にデプロイする 」の手順に従って、Node.js アプリを Azure にデプロイします。 アプリの 名前 には、 custompolicyapiなどのわかりやすい名前を使用します。 従って:

  • アプリの URL は、 https://custompolicyapi.azurewebsites.netのようになります。

  • サービス エンドポイントは、 https://custompolicyapi.azurewebsites.net/validate-accesscodeのようになります。

Microsoft PowerShell などの HTTP クライアントを使用して、デプロイしたアプリをテストできます。 今回は、エンドポイントとして https://custompolicyapi.azurewebsites.net/validate-accesscode URL を使用します。

手順 2 - REST API を呼び出す

アプリが実行されたので、カスタム ポリシーから HTTP 呼び出しを行う必要があります。 Azure AD B2C カスタム ポリシーは、外部サービスの呼び出しに使用する RESTful 技術プロファイル を提供します。

手順 2.1 - RESTful 技術プロファイルを定義する

ContosoCustomPolicy.XML ファイルで、ClaimsProviders セクションを見つけ、次のコードを使用して新しい RESTful 技術プロファイルを定義します。

    <!--<ClaimsProviders>-->
        <ClaimsProvider>
            <DisplayName>HTTP Request Technical Profiles</DisplayName>
            <TechnicalProfiles>
                <TechnicalProfile Id="ValidateAccessCodeViaHttp">
                    <DisplayName>Check that the user has entered a valid access code by using Claims Transformations</DisplayName>
                    <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.RestfulProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
                    <Metadata>
                        <Item Key="ServiceUrl">https://custompolicyapi.azurewebsites.net/validate-accesscode</Item>
                        <Item Key="SendClaimsIn">Body</Item>
                        <Item Key="AuthenticationType">None</Item>
                        <Item Key="AllowInsecureAuthInProduction">true</Item>
                    </Metadata>
                    <InputClaims>
                        <InputClaim ClaimTypeReferenceId="accessCode" PartnerClaimType="accessCode" />
                    </InputClaims>
                </TechnicalProfile>
            </TechnicalProfiles>
        </ClaimsProvider>
    <!--</ClaimsProviders>-->

プロトコルから、 RestfulProvider を使用するように技術プロファイルが構成されていることを確認できます。 メタデータ セクションでは、次の情報を確認することもできます。

  • ServiceUrlは API エンドポイントを表します。 その値は https://custompolicyapi.azurewebsites.net/validate-accesscode。 別の方法を使用して Node.js アプリをデプロイした場合は、必ずエンドポイント値を更新してください。

  • SendClaimsIn は、入力要求を RESTful クレーム プロバイダーに送信する方法を指定します。 使用可能な値: Body (default)FormHeaderUrl 、または QueryString。 この記事にあるように Body を使用すると、POST HTTP メソッドを使用し、リクエストの本文でキーと値のペアとしてフォーマットされたデータを API に送信します。 GET HTTP 動詞を呼び出し、クエリ文字列としてデータを渡す方法について説明します

  • AuthenticationType は、RESTful クレーム プロバイダーが実行する認証の種類を指定します。 RESTful クレーム プロバイダーは保護されていないエンドポイントを呼び出すので、 AuthenticationTypeNone に設定します。 認証の種類を Bearer に設定する場合は、アクセス トークンのストレージを指定する CryptographicKeys 要素を追加する必要があります。 RESTful クレーム プロバイダーがサポートする認証の種類について説明します。

  • InputClaim 属性は、API でデータを受け取る方法を指定します。

手順 2.2 - 検証技術プロファイルを更新する

Azure AD B2C カスタム ポリシーを使用したユーザー体験での分岐の作成で、要求変換を使用して accessCode を検証しました。 この記事では、外部サービスへの HTTP 呼び出しを行って accessCode を検証します。 そのため、新しいアプローチを反映するようにカスタム ポリシーを更新する必要があります。

AccessCodeInputCollector 技術プロファイルを見つけて、ValidationTechnicalProfile 要素の ReferenceId をValidateAccessCodeViaHttp に更新します。

更新前:

    <ValidationTechnicalProfile ReferenceId="CheckAccessCodeViaClaimsTransformationChecker"/>

宛先:

    <ValidationTechnicalProfile ReferenceId="ValidateAccessCodeViaHttp"/>

この時点で、 IdCheckAccessCodeViaClaimsTransformationChecker を含む技術プロファイルは不要であり、削除できます。

手順 3 - カスタム ポリシー ファイルをアップロードする

Node.js アプリが実行されていることを確認し、「 カスタム ポリシー ファイルのアップロード 」の手順に従ってポリシー ファイルをアップロードします。 ポータルに既に存在するファイルと同じ名前のファイルをアップロードする場合は、[ カスタム ポリシーが既に存在する場合は上書きする] を選択してください。

手順 4 - カスタム ポリシーをテストする

カスタム ポリシーをテストしてカスタム ポリシーをテストする手順に従います。

  1. [アカウントの種類] で、[個人アカウント] を選択します。
  2. 必要に応じて残りの詳細を入力し、[ 続行] を選択します。 新しい画面が表示されます。
  3. [アクセス コード] に「88888」と入力し、[続行] を選択します。 ポリシーの実行が完了すると、 https://jwt.msにリダイレクトされ、デコードされた JWT が表示されます。 手順を繰り返し、88888 以外の別のアクセス コードを入力すると、エラーが表示されます。入力したアクセス コードが正しくありません。もう一度お試しください。

手順 5 - デバッグ モードを有効にする

開発中は、 developerMessagemoreInfo など、API によって送信された詳細なエラーを確認できます。 この場合、RESTful 技術プロバイダーでデバッグ モードを有効にする必要があります。

  1. ValidateAccessCodeViaHttp 技術プロバイダーを見つけ、技術プロバイダーのmetadataに次の項目を追加します。

        <Item Key="DebugMode">true</Item>
    
  2. 変更を保存し、 ポリシー ファイルをアップロードします

  3. カスタム ポリシーをテストしますアクセス コードに間違った入力を使用していることを確認します。 次のスクリーンショットに示すようなエラーが表示されます。

    デバッグ モードを有効にしたときのスクリーンショット エラー。

複雑な要求 JSON ペイロードを処理する

呼び出す REST API で複雑な JSON ペイロードを送信する必要がある場合は、 GenerateJson JSON 要求変換を使用してペイロードを作成できます。 ペイロードを生成したら、JSON ペイロードを含むクレームの名前にメタデータオプションを使用できます。

たとえば、次の要求変換を使用して JSON ペイロードを生成します。

    <ClaimsTransformation Id="GenerateRequestBodyClaimsTransformation" TransformationMethod="GenerateJson">
        <InputClaims>
            <InputClaim ClaimTypeReferenceId="email" TransformationClaimType="customerEntity.email" />
            <InputClaim ClaimTypeReferenceId="objectId" TransformationClaimType="customerEntity.userObjectId" />
            <InputClaim ClaimTypeReferenceId="givenName" TransformationClaimType="customerEntity.firstName" />
            <InputClaim ClaimTypeReferenceId="surname" TransformationClaimType="customerEntity.lastName" />
            <InputClaim ClaimTypeReferenceId="accessCode" TransformationClaimType="customerEntity.accessCode" />
        </InputClaims>
        <InputParameters>
            <InputParameter Id="customerEntity.role.name" DataType="string" Value="Administrator" />
            <InputParameter Id="customerEntity.role.id" DataType="long" Value="1" />
        </InputParameters>
        <OutputClaims>
            <OutputClaim ClaimTypeReferenceId="requestBodyPayload" TransformationClaimType="outputClaim" />
        </OutputClaims>
    </ClaimsTransformation>

ClaimsTransformation では、次の JSON オブジェクトが生成されます。

{
   "customerEntity":{
      "email":"john.s@contoso.com",
      "userObjectId":"aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb",
      "firstName":"John",
      "lastName":"Smith",
      "accessCode":"88888",
      "role":{
         "name":"Administrator",
         "id": 1
      }
   }
}

次に、次に示すように、RESTful 技術プロバイダーの メタデータInputClaimsTransformationsInputClaims を更新します。

    <Metadata>
        <Item Key="ClaimUsedForRequestPayload">requestBodyPayload</Item>
        <!--Other Metadata items -->
    </Metadata>
    
    <!--Execute your InputClaimsTransformations to generate your request Payload-->
    <InputClaimsTransformations>
        <InputClaimsTransformation ReferenceId="GenerateRequestBodyClaimsTransformation" />
    </InputClaimsTransformations>
    
    <InputClaims>
        <InputClaim ClaimTypeReferenceId="requestBodyPayload" />
    </InputClaims>

REST API からデータを受信する

REST API がデータを返す場合(ポリシーに要求として含める)、RESTful 技術プロファイルの OutputClaims 要素に要求を指定することで受け取ることができます。 ポリシーで定義されている要求の名前が REST API で定義されている名前と異なる場合は、 PartnerClaimType 属性を使用してこれらの名前をマップする必要があります。

「データの受信」の手順を使用して、カスタム ポリシーで想定されるデータの書式を設定する方法、null 値を処理する方法、および API の入れ子になった JSON 本文を REST で解析する方法について説明します。

次に、次の情報を確認します。