> ## Documentation Index
> Fetch the complete documentation index at: https://auth0.com/llms.txt
> Use this file to discover all available pages before exploring further.

# サインアップとログインプロンプトをカスタマイズする

> ユニバーサルログイン向けにサインアップとログインプロンプトをカスタマイズする方法について説明します。

<Card title="Before you start">
  1. テナントに[**カスタムドメイン** ](/docs/ja-jp/customize/custom-domains)が構成されていることを確認します。
  2. すべてのサインアップとログインのプロンプトに[**ユニバーサルログイン** ](/docs/ja-jp/authenticate/login/auth0-universal-login/universal-login-vs-classic-login/universal-experience)が使用されており、ログインプロンプトに\*\*［Customize Login Page（ログインページのカスタマイズ）］\*\* が無効になっていることを確認します。
  3. [［Custom Page Template（カスタムページテンプレート）］](/docs/ja-jp/customize/universal-login-pages/universal-login-page-templates#custom-sign-up-prompts)が構成されていることを確認します。
</Card>

**サインアップとログインプロンプトのカスタマイズ** 機能によって、カスタムドメインとカスタムページテンプレートが有効になっている顧客は、カスタムフィールドとコンテンツをアプリのサインアップとログインプロンプトに追加することができます。

#### ユースケース

サインアップとログインプロンプトのカスタマイズでは、**custom content** と**data capture** という2つのユースケースに対応しています。

**カスタムコンテンツ** とは、テキストやリンク、画像などサインアップとログインプロンプトに直接配置された静的コンテンツのことです。

**データキャプチャー** は、サインアップとログインプロンプトに動的に追加されたフォーム要素を使用します。データキャプチャーは、ユーザーコンテンツや苗字などユーザーが生成したデータの収集と検証に役立ちます。データキャプチャーを利用できるのは、Passkeyを持っていないDatabase Connections認証ユーザーのみです。

<Warning>
  機密性の高いデータや規制されたデータを伝達または収集する際は、Oktaとの契約に基づいて許可されている場合に限り、サインアッププロンプトとログインプロンプトのカスタマイズ機能を使用できます。
</Warning>

**Prompt（プロンプト）** とは、ある認証フローでの特定のステップのことです。プロンプトにはそれぞれ、少なくとも1つの**Screen（スクリーン）** があり、テナントの構成に応じて、対応するスクリーンには4つか6つの**Entry Points（エントリーポイント）** カスタムコード（**Partials（パーシャル）** ）が挿入可能なスクリーン内の場所を指します。

#### 用語

カスタマイズできるプロンプトは以下のとおりです。

パーシャルは、条件ロジックと動的変数を使用できるよう、HTML、CSS、Javascript、および[Liquid構文](https://github.com/Shopify/liquid/wiki/Liquid-for-Designers)に対応しています。さらに、[Page Template（ページテンプレート）](/docs/ja-jp/customize/login-pages/universal-login/customize-templates)にあるLiquid変数も使用することができます。

* `signup`
* `signup-id`
* `signup-password`
* `login（ログイン）`
* `login-id`
* `login-password`
* `login-passwordless`

  * `login-passwordless-sms-otp`
  * `login-passwordless-email-code`

これらのエントリーポイントはデータベース接続が有効な場合に使用できます。

以下のエントリーポイントは、少なくとも1つのソーシャルまたはエンタープライズ接続が有効な場合に使用できます。

* `form-content-start`
* `form-content-end`
* `form-footer-start`
* `form-footer-end`

\|  |  |\
\| --- | --- | --- |
\| サインアップ | サインアップID | サインアップパスワード |

* `secondary-actions-start`
* `secondary-actions-end`

パーシャルは最大10,000文字で指定し、`/v2/prompts/{prompts_name}/partials`で[Auth0 Management API](https://auth0.com/docs/api/management/v2/prompts/put-partials)が管理することができます。プロンプトはそれぞれ、パーシャルを追加、更新、または削除するときに、`スクリーン`を指定する必要があります。以下の例は、プロンプトの既存のすべてのパーシャルを表示するために呼び出しを行ったものです。APIの呼び出しでエントリーポイントを参照する場合、`ulp-container`接頭辞が必要でないことに注意してください。

#### Management APIを使用してパーシャルを管理する

カスタムプロンプトは現在、[Auth0のDeploy CLIツール](https://auth0.com/docs/deploy-monitor/deploy-cli-tool)またはAuth0 CLIには対応していません。

```javascript lines theme={null}
GET /api/v2/prompts/signup-id/partials
# response
# success code: 200
# not found code: 404
body: {
  "signup-id": {
    "form-content-start": "<div>HTML or Liquid</div>...",
    "form-content-end": "<div>HTML or Liquid</div>..."
  }
}
```

サインアップとログインプロンプトのカスタマイズには、特定のHTMLフォーム要素に対して事前に構築されたスタイルとクライアント側の検証サポートが備わっています。以下の要素がサポートされています。

<Frame>
  <img src="https://mintlify.s3.us-west-1.amazonaws.com/auth0/docs/images/ja-jp/cdy7uua7fh8z/KxWfVAMkumyI2jrUqkEp8/b9315709899864a2f8758ad7f5a4f5b2/Partials_CLI_Image.jpg" alt="An image showing the command-line interface for Partials. " />
</Frame>

#### スタイルと検証フォームの入力

事前に構築された入力スタイルを使用するには、`<div>`内の希望するフォーム要素を`ulp-field`クラスでラップします。同様に、事前に構築されたエラースタイルを使用するために、`ulp-error`クラスを同じ`<div>`に追加します。`ulp-error-info`要素が存在する場合は、スタイル設定されたエラーメッセージも表示されます。

* `<input type="text">`
* `<input type="number">`
* `<input type="checkbox">`
* `<input type="password">`
* `<input type="email">`
* `<input type="tel">`
* `<input type="url">`
* `<select>`
* `<textarea>`

機能のクライアント側検証フレームワークを使用すると、顧客はHTML属性を使ってユーザー入力を検証し、1つ以上のカスタム検証機能を実行することができます。検証機能はパーシャルに直接含まれているか、ページテンプレートの`<head>`に含まれています。

#### クライアント側検証

クライアント側検証をフォーム要素に追加するには、以下のようにします。

<Accordion title="入力フィールド要素 入力フィールドの事前設定スタイル">
  ```javascript lines theme={null}
  <div class="ulp-field">
    <label for="first-name">First Name</label>
    <input type="text" name="ulp-first-name" id="first-name">
    <div class="ulp-error-info">
      First Name is Required
    </div>
  </div>
  ```
</Accordion>

<Accordion title="要素を選択 選択フィールドの事前設定スタイル">
  ```javascript lines theme={null}
  <div class="ulp-field">
    <label for="preferred-language">Preferred Language</label>
    <select name="ulp-preferred-language" id="preferred-language">
      <option></option>
      <option value="english">English</option>
      <option value="french">French</option>
      <option value="spanish">Spanish</option>
    </select>
    <div class="ulp-error-info">
      Please Select a Language.
    </div>
  </div>
  ```
</Accordion>

<Accordion title="テキスト要素 テキストフィールドの事前設定スタイル">
  ```javascript lines theme={null}
  <div class="ulp-field">
    <label for="comments">Comments</label>
    <textarea type="text" name="ulp-comments" id="comments"></textarea>
    <div class="ulp-error-info">
      Please provide an answer.
    </div>
  </div>
  ```
</Accordion>

<Accordion title="チェックボックス要素 チェックボックスフィールドの事前設定スタイル">
  ```javascript lines theme={null}
  <div class="ulp-field">
    <input type="checkbox" name="ulp-terms-of-service" id="terms-of-service">
    <label for="terms-of-service">
      I agree to the <a href="#">Terms of Service</a>
    </label>
    <div class="ulp-error-info">
      Please agree to the Terms of Service.
    </div>
  </div>
  ```
</Accordion>

<Accordion title="電話番号の検証 クライアント側の電話番号の検証">
  ```javascript lines theme={null}
  // Validation Function
  <script>
    function validatePhoneFunction(element, formSubmitted) {
      if (!formSubmitted) {
        return true;
      }
      return element.value.replace(/\D/g, '').length === 10;
    }
  </script>

  // Custom Input Field including the validation error HTML
  <div class="ulp-field">
    <label for="ulp-field-phone">Phone Number</label>
    <input type="text" name="ulp-field-phone" id="ulp-field-phone">
    <div
      class="ulp-error-info"
      data-ulp-validation-function="validatePhoneFunction"
      data-ulp-validation-event-listeners="blur,change,input,focus">
      Invalid phone number
    </div>
  </div>
  ```
</Accordion>

<Accordion title="Screen Reader Validation Validation for accessible error messages">
  ```javascript lines theme={null}
  <script>
    function requiredTextFunction(element, formSubmitted) {
      if (!formSubmitted) return true;
      return element.value.trim().length > 0;
    }
  </script>

  <div class="ulp-field">
    <label for="ulp-phone">Phone Number</label>
    <input
      type="text"
      id="ulp-phone"
      name="ulp-field-phone"
      aria-describedby="error-phone-required"
      aria-invalid="true"
      required
    >
    <div
      id="error-phone-required"
      class="ulp-error-info"
      role="alert"
      data-ulp-validation-function="requiredTextFunction"
      data-ulp-validation-event-listeners="change"
    >
      Phone number is required
    </div>
  </div>
  ```
</Accordion>

* `<div class="ulp-error-info">`要素の`data-ulp-validation-function`属性を使用して、検証機能を参照します。
* どのDOMイベント上で、検証機能を`<div class="ulp-error-info">`要素の`data-ulp-validation-event-listeners`属性を使用して実行する必要があるかを宣言します。検証は提出時に自動的に実行されることに注意します。

<Warning>
  サインアップページでサードパーティのJavaScriptを使用する際は、十分に注意してください。サインアップページは、セキュリティ関連の機密情報を扱うことが多いため、クロスサイトスクリプティング攻撃に対して脆弱です。

  ユーザーから提供されたデータは、可能な限り、検証してから送信することをお勧めします。
</Warning>

パーシャルコンテンツをローカライズするには、[カスタムテキストAPI](/docs/ja-jp/api/management/v2/prompts/put-custom-text-by-language)を使用して、新しいカスタムテキスト変数を定義します。スクリーン/言語の組み合わせごとに定義できるカスタムテキスト変数の数は最大30です。

#### コンテンツをローカライズする

カスタムテキストAPIは[こちら](/docs/ja-jp/api/management/v2/prompts/get-custom-text-by-language)から入手でき、各変数は`var-<name>`命名規則に従っています。APIへの呼び出しは、カスタムテキスト変数を追加、更新、または削除するときに、Screen（スクリーン）を指定する必要があります。マークダウンリンクはサポートされており、ユーザーに表示される前にHTML `<a>`要素に変換されます。

##### カスタムテキスト変数を作成または更新する

以下は、利用規約チェックボックスのラベルのテキストの変数を英語とスペイン語で追加するための呼び出し例です。詳細については、<Tooltip data-tooltip-id="react-containers-DefinitionTooltip-0" href="/docs/ja-jp/glossary?term=management-api" tip="Management API: 顧客が管理タスクを実行できるようにするための製品。" cta="用語集の表示">Management API</Tooltip>を参照してください。

```javascript lines theme={null}
# PUT /api/v2/prompts/signup-id/custom-text/en
{
  "signup": {
    "var-tos": "I agree with the [Terms of Service](https://en.example.com/tos)"
  }
}

# PUT /api/v2/prompts/signup-id/custom-text/es
{
  "signup": {
    "var-tos": "Estoy de acuerdo con los [Términos de Servicio](https://es.example.com/tos)"
  }
}
```

カスタムテキスト変数は、`prompts.screen.text`オブジェクトを使用して、パーシャルで参照されます。前のセクションで示した`var-tos`の例に対する参照は、`prompt.screen.texts.varTos`です。Signup ID Prompt,（サインアップIDプロンプト）のパーシャルで前に作成した変数を使用する方法の例については、以下を参照してください。Management APIの`var-tos`変数がパーシャルで`varTos`として参照されることに注意します。

##### カスタムテキスト変数をパーシャルで使用する

```javascript lines theme={null}
# PUT api/v2/prompts/signup/partials
{
  "signup": {
    "form-content-end": "<div class='ulp-field'><input type='checkbox' name='ulp-terms-of-service' id='terms-of-service'><label for='terms-of-service'>{{ prompt.screen.texts.varTos }}</label></div>"
  }
}
```

カスタムフォーム要素でキャプチャーしたデータはActions（アクション）で使用できます。Auth0では、収集したデータを検証することを推奨します。

#### キャプチャーしたデータを検証して保存する

<Warning>
  フォームにカスタムの要素を使用する場合は、データをアクションで使用できるように、入力名に`ulp-`プレフィックスを含める必要があります。
</Warning>

Actionはそれぞれ、キャプチャしたデータを`event.request.body`上のオブジェクトとして受け取ります。顧客は、`api.validation.error`関数を使用して、検証エラーを返すことができます。

<Warning>
  フォームで収集したデータは、保存やレンダリングする前に必ずサニタイズしてください。

  * 保存されたデータがすべて[Liquidの{{escape}}ヘルパー関数](https://shopify.github.io/liquid/filters/escape/)を通過していることを確認します
  * メールテンプレートのデータをレンダリングする際には、Liquid構文を削除します
  * Webページでデータをレンダリングする際には、HTMLエンティティをエスケープします
  * データベースにデータを保存する際には、パラメーター化クエリを使用します
  * クエリ文字列にデータを渡す場合には、たとえば、`{{encodeURI}}`または`{{encodeURIParam}}`を用いてエンコードします

  リスクの軽減に関する詳細とデータを安全に保存するベストプラクティスについては、[こちらのチートシート](https://cheatsheetseries.owasp.org/cheatsheets/Input_Validation_Cheat_Sheet.html)を参照してください。
</Warning>

Actionから、キャプチャーされたデータは外部APIに送信されて検証および保管されるか、`api.user.setUserMetadata`を通じてユーザーの`user_metadata`に保存されます。

* サインアッププロンプトからのデータは、ユーザー登録前トリガーでアクセスできます。検証エラーが返さると、ユーザーは登録できません。
* ログインプロンプトからのデータは、ログイン後トリガーでアクセスできます。検証エラーが返されると、顧客のアプリケーションのエラーページに転送されます。

```javascript lines theme={null}
# Given this code in the signup form
# <div class="ulp-field">
#   <label for="full-name">Full Name</label>
#   <input type="text" name="ulp-full-name" id="full-name">
# </div>

exports.onExecutePreUserRegistration = async (event, api) => {
  const fullName = event.request.body['ulp-full-name'];
  if(!fullName) {
    api.validation.error("invalid_payload", "Missing Name");
    return;
  }

  api.user.setUserMetadata("fullName", fullName);
};
```

* サインアッププロンプトとログインプロンプトからのデータはどちらもログイン後トリガーでアクセスできます。検証エラーが返されると、顧客のアプリケーションのエラーページに転送されます。

<Warning>
  フォームで収集したデータは、保存やレンダリングする前に必ずサニタイズしてください。

  * 保存されたデータがすべて[Liquidの{{escape}}ヘルパー関数](https://shopify.github.io/liquid/filters/escape/)を通過していることを確認します
  * メールテンプレートのデータをレンダリングする際には、Liquid構文を削除します
  * Webページでデータをレンダリングする際には、HTMLエンティティをエスケープします
  * データベースにデータを保存する際には、パラメーター化クエリを使用します
  * クエリ文字列にデータを渡す場合には、たとえば、`{{encodeURI}}`または`{{encodeURIParam}}`を用いてエンコードします

  リスクの軽減に関する詳細とデータを安全に保存するベストプラクティスについては、[こちらのチートシート](https://cheatsheetseries.owasp.org/cheatsheets/Input_Validation_Cheat_Sheet.html)を参照してください。
</Warning>

##### ユーザーメタデータに保存する

取得したデータは検証と保管のためにActionから外部APIに送信されるか、`api.user.setUserMetadata`を通してユーザーの`user_metadata`に保存されます。

```javascript lines theme={null}
# Given this code in the signup form
# <div class="ulp-field">
#   <label for="full-name">Full Name</label>
#   <input type="text" name="ulp-full-name" id="full-name">
# </div>

exports.onExecutePreUserRegistration = async (event, api) => {
  const fullName = event.request.body['ulp-full-name'];
  if(!fullName) {
    api.validation.error("invalid_payload", "Missing Name");
    return;
  }

  api.user.setUserMetadata("fullName", fullName);
};
```

## もっと詳しく

* [動的変数でカスタムフォームの要素を国際化する](/docs/ja-jp/customize/login-pages/universal-login/customize-signup-and-login-prompts/use-dynamic-variables-to-internationalize-custom-form-elements)
