Azure Active Directory B2C でカスタムポリシーを使った際の完全日本語化への道

# はじめに
Azure Active Directory B2C(以下 B2C)には以下の二通りのフローが存在します。

- ユーザーフロー
- カスタムポリシー

今回、取り上げるのはカスタムポリシーを使用した際の日本語化手順になります。
カスタムポリシー自体xmlで記載するということもあり、（個人的に）難解なのでここにまとめます。

# 前準備
本記事では以下のMicrosoft公式ドキュメントの設定を終えたところから始めます。
各々すでにカスタムポリシーを準備済みの方は飛ばしてください。

[チュートリアル:Azure Active Directory B2C に Web アプリケーションを登録する](https://docs.microsoft.com/ja-jp/azure/active-directory-b2c/tutorial-register-applications?tabs=app-reg-ga)

[チュートリアル: Azure Active Directory B2C でユーザー フローとカスタム ポリシーを作成する](https://docs.microsoft.com/ja-jp/azure/active-directory-b2c/tutorial-create-user-flows?pivots=b2c-custom-policy)

# 日本語化設定

大まかな手順は3つです。
1. localizationタグを設定し大部分を日本語化する。
2. 手順1で日本語化されなかった部分（主にリテラルなど）を手作業で日本語に書き換える。
3. B2Cバックエンドと通信している部分を日本語化する。

## 手順1 localizationタグを設定し大部分を日本語化する。

基本は以下の通り進めます。
[Azure Active Directory B2C での言語のカスタマイズ](https://docs.microsoft.com/ja-jp/azure/active-directory-b2c/language-customization?pivots=b2c-custom-policy)

今回は上記ドキュメントとは異なりTrustFrameworkBase.xmlファイルを編集していきます。
BuildingBlocks要素に以下の内容を追加し、ポリシーをビルド後、アップロードします。

```xml:TrustFrameworkBase.xml
...省略...
<Localization Enabled="true">
    <SupportedLanguages DefaultLanguage="ja" MergeBehavior="ReplaceAll">
    <SupportedLanguage>ja</SupportedLanguage>
    </SupportedLanguages>
</Localization>
...省略...
```

そうすると以下のようにある程度日本語になっているはずです。
これで手順1はおしまいです。

![localizationタグ設定後.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2034469/517703fb-2e22-699f-9703-76d4c273b181.png)


## 手順2 手順1で日本語化されなかった部分（主にリテラルなど）を手作業で日本語に書き換える。

手順2でもTrustFrameworkBase.xmlファイルを編集していきます。

至るところに以下のようなコードがあると思います。
このDisplayNameの部分の日本語に書き換えていきます。
（UserHelpTextはマウスオーバーしたときに出てくるメッセージです。必要に応じて変更しましょう。）

変更前

```xml:TrustFrameworkBase.xml
...省略...
<ClaimType Id="signInName">
    <DisplayName>Sign in name</DisplayName>
    <DataType>string</DataType>
    <UserHelpText/>
    <UserInputType>TextBox</UserInputType>
</ClaimType>
...省略...
```

変更後

```xml:TrustFrameworkBase.xml
...省略...
<ClaimType Id="signInName">
    <DisplayName>メールアドレス</DisplayName>
    <DataType>string</DataType>
    <UserHelpText/>
    <UserInputType>TextBox</UserInputType>
</ClaimType>
...省略...
```

するとおおよそ以下のようになると思います。


![リテラル変更後.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2034469/c7bf1d32-a753-28c2-9a8b-b00d63da64bc.png)


**基本的に変更したい文字列をxmlファイル内で検索かけるとそれっぽいところがあるのでそこを書き換えます**

これで手順2もおしまいです。

### 補足

これはサインアップ画面ですが登録ボタンがCreateのままです。

![変更前サインアップ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2034469/840131fa-9e52-e57e-ba2d-edcffeed7ffa.png)


これも以下のように変更して日本語に変更してしまいます。

変更前

```xml:TrustFrameworkBase.xml
...省略...
<Metadata>
    <Item Key="IpAddressClaimReferenceId">IpAddress</Item>
    <Item Key="ContentDefinitionReferenceId">api.localaccountsignup</Item>
    <Item Key="language.button_continue">Create</Item>
</Metadata>
...省略...
```

変更後

```xml:TrustFrameworkBase.xml
...省略...
<Metadata>
    <Item Key="IpAddressClaimReferenceId">IpAddress</Item>
    <Item Key="ContentDefinitionReferenceId">api.localaccountsignup</Item>
    <Item Key="language.button_continue">登録</Item>
</Metadata>
...省略...
```


## 手順3 B2Cバックエンドと通信している部分を日本語化する。

下の画像はサインアップ後、誤ったパスワードを入力してサインインボタンを押したときの画面です。

![バックエンドエラーメッセージ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2034469/04a7b806-8764-36dd-48d2-8a6f7f888ae1.png)


手順3は画像にもある通り、下記エラーメッセージの修正になります。
> The username or password provided in the request are invalid.


以下の部分を修正します。

```diff_xml:TrustFrameworkBase.xml
...省略...
    <Item Key="ProviderName">https://sts.windows.net/</Item>
    <Item Key="METADATA">https://login.microsoftonline.com/{tenant}/.well-known/openid-configuration</Item>
    <Item Key="authorization_endpoint">https://login.microsoftonline.com/{tenant}/oauth2/token</Item>
    <Item Key="response_types">id_token</Item>
    <Item Key="response_mode">query</Item>
    <Item Key="scope">email openid</Item>
-   <Item Key="grant_type">password</Item>
...省略...
```

ハイライトした行を消します。
こうすることでエラーメッセージが変化し、手順2の対応をすることで日本語化することができます。

これにてB2Cカスタムポリシー完全日本語化終了となります。

## さいごに
ユーザーフローはAzure PortalのUIからポチポチ変更していけますがカスタムポリシーは一筋縄ではいかず苦戦しました。
特に手順3が鬼門でした。
B2Cのカスタムポリシーの情報が少ないということ、日本語にローカライズするユーザーが少ないこと、
この2点に苦しめられました。
もっと簡単な実装方法・アドバイス等ありましたらコメントいただけますと幸いです。

また今回の記事に使用したxmlファイルはGitHubに置いておきますのでもし参考にされる方がいらっしゃれば…
[GitHub_qiita_b2c_custom_policy](https://github.com/bory-kb/qiita_b2c_custom_policy)