LoginSignup
4
4

More than 1 year has passed since last update.

Azure AD B2Cカスタムポリシーを利用し、認証フローの中で独自のREST APIを呼び出す

Last updated at Posted at 2020-12-25

Azure AD B2Cでは、認証フローの一連の流れの中で独自のREST APIを呼び出すことができ、独自のビジネスロジックを認証フローの中に組み込むことができます。

また、Azure AD B2Cで認証フローを定義する方法は「ユーザーフロー」と「カスタムポリシー」の2通りがあります。
Azure AD B2Cのドキュメントにも記載されている通り、ユーザーフローを使った認証フロー作成が推奨されていますが、REST API呼び出しに関してはカスタムポリシーでのみサポートされています。

そこでカスタムポリシーでREST APIを呼び出すにあたり、何点かハマった箇所があったのでポイントをまとめました。

カスタムポリシーの記述方法

カスタムポリシーでのREST API呼び出しについてはこちらのドキュメントをご参照ください。
https://docs.microsoft.com/ja-jp/azure/active-directory-b2c/custom-policy-rest-api-intro

また、Azure公式で公開されているサンプルコードはこちらです。
https://github.com/azure-ad-b2c/rest-api/

REST API呼び出しのポイント

URLはServiceUrlに記述する

  • APIのURLはTechnicalProfileServiceUrl部分に記述します。
    • 呼び出すAPIは、インターネットゾーン経由でアクセスできる必要があります。
    • 動作確認は以下で良いのですが、セキュリティリスクを鑑みて「お使いの RESTful サービスを保護する」を適用することを推奨します。
<TechnicalProfile Id="TestApi">
  ...
  <Metadata>
    <Item Key="ServiceUrl">https://xxx.example.com/api/auth/user</Item>
    <Item Key="AuthenticationType">None</Item>
    <Item Key="SendClaimsIn">Body</Item>
    <Item Key="AllowInsecureAuthInProduction">true</Item>
  </Metadata>
</TechnicalProfile>

タイムアウトは30秒、リトライは2回

  • REST API呼び出しのタイムアウトとリトライ回数は下記に設定されており、現状カスタムができません。
    • タイムアウト:30秒
    • リトライ:2回まで

HTTPメソッドは全てPOST

  • Azure AD B2Cが呼び出すAPIは、HTTPメソッドがすべてPOSTとなります。

リクエストはInputClaimsに記述する

  • リクエストの内容はInputClaims部分に記載します。
    • ClaimTypeReferenceIdに記述する部分はClaimsSchemaに定義されている必要があります。
<TechnicalProfile Id="TestApi">
  ...
  <InputClaims>
    <InputClaim ClaimTypeReferenceId="objectId" />
    <InputClaim ClaimTypeReferenceId="email" />
  </InputClaims>
  ...
</TechnicalProfile>

レスポンスはOutputClaimsに記述する

  • レスポンスの内容はOutputClaims部分に記載します。
    • リクエスト同様、ClaimTypeReferenceIdに記述する部分はClaimsSchemaに定義されている必要があります。
<TechnicalProfile Id="TestApi">
  ...
  <OutputClaims>
    <OutputClaim ClaimTypeReferenceId="employeeId" />
  </OutputClaims>
  ...
</TechnicalProfile>

カスタムポリシーのXMLは規定の順番通りに記述する

  • B2Cのカスタムポリシーは決められた順番通りにXMLを記述する必要があります。
  • 例えばTechnicalProfile内部の順番は下記の通り記述します。
    1. DisplayName
    2. Protocol
    3. Metadata
    4. InputClaims
    5. OutputClaims

REST APIでリクエストを受け取る方法

  • Azure AD B2Cで呼び出すREST APIはContent-Typeの指定が無いため、HTTP Requestを直接参照する必要があります。
  • 上述で紹介したサンプルコードに.NETやJava等の様々な環境でのREST APIの例が記載されているため、そちらも合わせてご参照ください。
  • .NET Coreでの記述例は下記の通りです。
var input = "";

// HTTP Requestを読み取る
using (StreamReader reader = new StreamReader(Request.Body, Encoding.UTF8))
{
    input = await reader.ReadToEndAsync();
}

// JSON形式にデシリアライズ
return JsonConvert.DeserializeObject<T>(input);

エラー時のレスポンス形式は規定の形式にする

  • エラー時のステータスコードやレスポンスの形式は、規定の形式に合わせる必要があります。

UserJourneysでのREST APIを呼び出す

  • UserJourneysセクションにAPI呼び出しをしているTechnicalProfileを定義します。
  • その際、TechnicalProfileReferenceIdの部分はTechnicalProfileIdと合わせる必要があります。
<UserJourneys>
  <UserJourney Id="SignUpOrSignIn">
    <OrchestrationSteps>
     ...
      <OrchestrationStep Order="7" Type="ClaimsExchange">
        <ClaimsExchanges>
          <ClaimsExchange Id="TestApi" TechnicalProfileReferenceId="TestApi" />
        </ClaimsExchanges>
      </OrchestrationStep>
       ...
    </OrchestrationSteps>
     ...
  </UserJourney>
<UserJourneys>

関連記事

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4