> ## Documentation Index
> Fetch the complete documentation index at: https://docs-dev-actions-triggers-prototype.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# ユニバーサルログインに対するMFA登録をカスタイズする

> ポストログインアクションを使用して、MFAフローをカスタマイズし、指定要素でユーザーに登録を促します。

Auth0は[多要素認証（MFA）](/docs/ja-jp/secure/multi-factor-authentication/multi-factor-authentication-factors)でユーザーアクセスを確保するための様々な要素をサポートしています。`ポストログイン`アクションを使用することで、<Tooltip data-tooltip-id="react-containers-DefinitionTooltip-0" href="/docs/ja-jp/glossary?term=multifactor-authentication" tip="多要素認証（MFA）: ユーザー名とパスワードに加えて、SMS経由のコードなどの要素を使用するユーザー認証プロセス。" cta="用語集の表示">MFA</Tooltip>フローをカスタマイズし、指定要素でユーザーにに登録を促します。要素でユーザーが登録をした後、その要素を今後のログインの認証の2番目のメソッドとして使用できます。

コンテキスト情報を使用して、MFA登録フローをさらにカスタマイズすることもできます。たとえば、あるアプリケーションではSMSに登録するようユーザーに促し、別のアプリケーションではプッシュ通知またはWebAuthNに登録するようユーザーに促すことができます。

この機能を使用すると、MFA登録フローをカスタマイズすることができます。すでに登録されているユーザーのMFAフローをカスタマイズしたい場合、「[ユニバーサルログインに対するMFA選択をカスタイズする](/docs/ja-jp/secure/multi-factor-authentication/customize-mfa/customize-mfa-selection-universal-login)」を参照してください。

## 仕組み

[アクション](/docs/ja-jp/customize/actions)を使用して、MFA登録フローをカスタマイズできます。具体的には、[ログインフロー](/docs/ja-jp/customize/actions/explore-triggers/signup-and-login-triggers/login-trigger)の`ポストログイン`トリガーを、以下の認証APIメソッドを使用して変更できます：

* `enrollWith`：登録時にユーザーに表示されるデフォルトの要素を指定します。オプションで、ユーザーが選択できる要素の代替リストを提供することも可能です。提供される場合、「別のメソッドを試す」リンクが登録プロンプトに表示されます。
* `enrollWithAny`：登録時にユーザーが選択できる要素のセットを指定します。デフォルトでは、このメソッドは、ユーザーが希望する要素を選択できる選択プロンプトを表示します。場合によっては、ユーザーエクスペリエンスが異なる場合があります。

  * 複数の要素が指定された場合、選択プロンプトがユーザーに表示されます。
  * ユーザーが1つを除く他のすべての指定された要素で登録済みの場合は、選択プロンプトはスキップされ、ユーザーは残りのファクターで登録するように促されます。
  * ユーザーがすべての指定された要素で登録済みの場合は、コマンドは失敗し、ログインシーケンスは継続します。

これらのメソッドを組み合わせて、MFA登録フローをカスタマイズできます。ロールや最後にログインした日付などのユーザーメタデータを組み込んで、よりカスタマイズされたエクスペリエンスを作成することもできます。

カスタマイズされた登録フローは次の要素をサポートします。

* `otp`
* `recovery-code`
* `push-notification`
* `phone`

  * `preferredMethod: voice`
  * `preferredMethod: sms`
  * `preferredMethod: both`
* `webauthn-platform`
* `webauthn-roaming`

ユーザーが要素で登録した後、その値は`enrolledFactors`に追加されます。このプロパティは、ユーザーアカウントに関連したアクティブ要素のリストを示します。

メソッド名が`mfa`に設定されている場合、配列`event.authentication.methods`には`type`フィールドが含まれます。このフィールドには、`enrolledFactors`の`type`フィールドで使用されるものと一致する因子値（文字列）が含まれます。

MFA登録が発生すると、`methods` には`name:mfa`のオブジェクトが含まれ、 `type`がそのイベントに使用される要素に設定されます。`methods`と`enrolledFactors`はアクションが最初に開始されたときにのみ更新されます。フローの次のアクションで登録イベントの結果にアクセスできます。

詳しくは、以下のリソースをご確認ください:

* [アクションのトリガー：ログイン後 - イベントオブジェクト](/docs/ja-jp/customize/actions/explore-triggers/signup-and-login-triggers/login-trigger/post-login-event-object)
* [アクションのトリガー：ログイン後 - APIオブジェクト](/docs/ja-jp/customize/actions/explore-triggers/signup-and-login-triggers/login-trigger/post-login-api-object)

### シーケンス化されたフローとコンテキストに基づくフロー

`enrollWith`や`enrollWithAny`コマンドを使用することで、コンテキスト情報を活用してユーザーに提示する最適な登録や一連の登録を決定できます。

* `enrollWith`コマンドは、初期またはデフォルトの要素と代替のリストをサポートします。ユーザーはコマンドごとに1つの要素のみを登録できます。
* `enrollWithAny`コマンドは要素のリストをサポートします。指定された要素の順序によって、リストがユーザーにどのように表示されるかが決まります。ユーザーはコマンドごとに1つの要素のみを登録できます。

これらのコマンドを使用すると、次のことが可能になります。

* **シーケンス化されたフロー** ：ユーザーに対して、特定の順序に並べた、一連の要素で登録します。
* **コンテキストに基づくフロー** ：フロー内での以前のコマンドに基づいて、どの要素でユーザーに促すかを決定します。

これらのフローを説明するために、次の例を考えてみましょう:

```javascript lines theme={null}
// Action 1

exports.onExecutePostLogin = async (event, api) => {
  if (event.user.enrolledFactors.length) {
    // already enrolled, challenge
    api.authentication.challengeWithAny(event.user.enrolledFactors.map(m => ({type: m.type})));
    if (event.user.app_metadata.isAdmin &&
        !event.user.enrolledFactors.some(m => m.type === 'webauthn-roaming')) {
          // if is admin and doesn't have a security key, meaning a different factor was used, enroll now
          api.authentication.enrollWith({type: 'webauthn-roaming'})
        }
  }
  else {
    // not enrolled; choose a factor to enroll now
    api.authentication.enrollWithAny([{type: 'webauthn-roaming'}, {type: 'otp'}]);
    if (event.user.app_metadata.isAdmin) {
      // one more factor for admins
      api.authentication.enrollWithAny([{type: 'webauthn-roaming'}, {type: 'otp'}]);
    }
  }
};

// Action 2

exports.onExecutePostLogin = async (event, api) => {
  function performed(type) {
    return event.authentication.methods.some(m => m.name === 'mfa' &&
           m.type === type &&
           Date.now() - new Date(m.timestamp).getTime() < 5000)
  }
  if (event.user.app_metadata.isAdmin) {
      // enforce both factors are used by challenging the one that has not been used yet
      if (!performed('webauthn-roaming')) {
        api.authentication.challengeWith({type: 'webauthn-roaming'})
      }
      else if (!performed('otp')) {
        api.authentication.challengeWith({type: 'otp'})
      }
  }
};
```

これら2つのアクションを組み合わせると、管理者ロールを**持たない** ユーザーがワンタイムパスワード（OTP）またはセキュリティ キーのいずれかを使用して登録する必要があるシナリオが作成されます。逆に、管理者ロールを**持つ** ユーザーは、両方の要素に登録する必要があります。

アクション1は、`app_metadata`を確認してユーザーが管理者であるかどうかを判断し、特定の要素に登録するようユーザーに促します。管理者ユーザーがOTPのみに登録している場合は、最初にOTPを入力して認証を完了する必要があります。次に、セキュリティキー（`webauthn-roaming`）を使用して登録するように促されます。

<Callout icon="file-lines" color="#0EA5E9" iconType="regular">
  ユーザーアカウントの安全性を確保するため、認証要素を追加したいユーザーは、既存のenrolledFactorsの1つを使ってMFAチャレンジを完了しなければなりません。この条件があることで、異なる要素と構成を持つアプリケーションがすでに使用されている状況で、カスタムのMFA登録ポリシーを安全に実装することが可能になります。
</Callout>

アクション1の実行後、フローは一時停止し、アクション2の実行時に`event.user.enrolledFactors`と`event.authentication.methods`の両方が更新されます。これにより、ユーザーにさまざまな要素に異議を申し立てるか登録するかの選択肢が与えられたときに、アクションコードは実際のユーザーデータに基づいて決定を下すことができます。

**注意** ：アクションを実行するこの方法は、`enrollWith`または`enrollWithAny`コマンドを含むものにしか適用されません。その他の目的を果たすアクションに影響はありません。

## 開始する前に

MFAフローをカスタマイズする前に、テナントでMFAをセットアップし、アクション設定を使用して、MFA要素のカスタマイズを有効にします。［<Tooltip data-tooltip-id="react-containers-DefinitionTooltip-0" href="/docs/ja-jp/glossary?term=auth0-dashboard" tip="Auth0 Dashboard: サービスを構成するためのAuth0の主製品。" cta="用語集の表示">Auth0 Dashboard</Tooltip>（Auth0ダッシュボード）］の[［Security（セキュリティ）］>［Multi-factor Auth（多要素認証Auth）］](https://manage.auth0.com/#/security/mfa)から、1つ以上の要素を設定し、MFAポリシーを定義することができます。

* 設定プロセスについての詳細は、「[多要素認証を有効にする](/docs/ja-jp/secure/multi-factor-authentication/enable-mfa)」をご覧ください。
* 指定要素の構成についての詳細は、「[多要素認証の要素](/docs/ja-jp/secure/multi-factor-authentication/multi-factor-authentication-factors)」をご覧ください。

フローのカスタマイズには、［追加設定］セクションのアクショントグルを使用して、［MFA要素のカスタマイズ］を有効にする必要があります。この設定が無効になっている場合、カスタマイズされたフローは、正常に作動しません。

<Frame>
  <img src="https://mintcdn.com/docs-dev-actions-triggers-prototype/CVqyjpVc9VVKbCsn/docs/images/ja-jp/cdy7uua7fh8z/2hv0ELTkkka3t230SXfxw/3df4a2e61198f7c2cfbf6864df592b39/MFA_-_Actions_toggle_-_Japanese.png?fit=max&auto=format&n=CVqyjpVc9VVKbCsn&q=85&s=43c73c73b8b9416747892a787064d77e" alt="［Auth0 Dashboard］>［Security（セキュリティ）］>［MFA（多要素認証）］>［Additional Settings（追加設定）］" data-og-width="941" width="941" data-og-height="290" height="290" data-path="docs/images/ja-jp/cdy7uua7fh8z/2hv0ELTkkka3t230SXfxw/3df4a2e61198f7c2cfbf6864df592b39/MFA_-_Actions_toggle_-_Japanese.png" data-optimize="true" data-opv="3" srcset="https://mintcdn.com/docs-dev-actions-triggers-prototype/CVqyjpVc9VVKbCsn/docs/images/ja-jp/cdy7uua7fh8z/2hv0ELTkkka3t230SXfxw/3df4a2e61198f7c2cfbf6864df592b39/MFA_-_Actions_toggle_-_Japanese.png?w=280&fit=max&auto=format&n=CVqyjpVc9VVKbCsn&q=85&s=eead10ebf7926c3e5ca574dd880961ad 280w, https://mintcdn.com/docs-dev-actions-triggers-prototype/CVqyjpVc9VVKbCsn/docs/images/ja-jp/cdy7uua7fh8z/2hv0ELTkkka3t230SXfxw/3df4a2e61198f7c2cfbf6864df592b39/MFA_-_Actions_toggle_-_Japanese.png?w=560&fit=max&auto=format&n=CVqyjpVc9VVKbCsn&q=85&s=3c013db73b259037c74cf4427b7e7a90 560w, https://mintcdn.com/docs-dev-actions-triggers-prototype/CVqyjpVc9VVKbCsn/docs/images/ja-jp/cdy7uua7fh8z/2hv0ELTkkka3t230SXfxw/3df4a2e61198f7c2cfbf6864df592b39/MFA_-_Actions_toggle_-_Japanese.png?w=840&fit=max&auto=format&n=CVqyjpVc9VVKbCsn&q=85&s=0f8629c18b4f083a2c1f167539c0ba47 840w, https://mintcdn.com/docs-dev-actions-triggers-prototype/CVqyjpVc9VVKbCsn/docs/images/ja-jp/cdy7uua7fh8z/2hv0ELTkkka3t230SXfxw/3df4a2e61198f7c2cfbf6864df592b39/MFA_-_Actions_toggle_-_Japanese.png?w=1100&fit=max&auto=format&n=CVqyjpVc9VVKbCsn&q=85&s=4771ee063fe2d2fd157bb2b904c3bc5f 1100w, https://mintcdn.com/docs-dev-actions-triggers-prototype/CVqyjpVc9VVKbCsn/docs/images/ja-jp/cdy7uua7fh8z/2hv0ELTkkka3t230SXfxw/3df4a2e61198f7c2cfbf6864df592b39/MFA_-_Actions_toggle_-_Japanese.png?w=1650&fit=max&auto=format&n=CVqyjpVc9VVKbCsn&q=85&s=b14794bee957cb240f0af0cdb3941e95 1650w, https://mintcdn.com/docs-dev-actions-triggers-prototype/CVqyjpVc9VVKbCsn/docs/images/ja-jp/cdy7uua7fh8z/2hv0ELTkkka3t230SXfxw/3df4a2e61198f7c2cfbf6864df592b39/MFA_-_Actions_toggle_-_Japanese.png?w=2500&fit=max&auto=format&n=CVqyjpVc9VVKbCsn&q=85&s=610607c4a18879f433986c5debc5ce8f 2500w" />
</Frame>

**注意** ：`enrollWith`または`enrollWithAny`コマンドを使用したアクションは、テナントでMFAを有効または無効にする既存のポリシーまたはルールをオーバーライドします。

## MFA登録フローをカスタマイズする

テナントにMFAを設定した跡、`ログイン後`のアクションを作成してMFA登録フローをカスタマイズできます。

<Warning>
  1つのテナント内のアクション（または一連のアクション）は、1つのユーザーフローにつき、次の**4つ** のコマンドしか実行できません。

  * `enrollWith`
  * `enrollWithAny`
  * `challengeWith`
  * `challengeWithAny`

  この制限を超えると（つまり、このタイプの5つ目のコマンドを実行しようとすると）、認証エラーが発生します。
</Warning>

### ポストログインアクションを作成する

アクションをAuth0 Dashboardで作成できます。

1. [［Actions（アクション）］>［Flows（フロー）］](https://manage.auth0.com/#/actions/flows)に移動し、**［Login（ログイン）］** を選択します。
2. 追加アクションパネルで、**プラス記号(+)** アイコンを選択し、**［Build from scratch（ゼロから構築）］** を選択します。
3. アクションの作成のポップアップでの表示:

   * アクションの名前を入力します。
   * トリガーとして、 **ログイン/ポストログイン** を選択します。
   * ランタイムには、**Node 18（推奨）** を使用します。
4. 正確性のために、ポップアップをご確認ください。その後、 **［作成］** を選択します。
5. コードエディターでは、カスタムコードを`onPostExecute`コマンドに追加します。
6. コマンドの準備が整ったら、**［導入］** を選択します。
7. 成功した導入通知で **［フローの追加］** を選択します。

   * **注意** ：通知が閉じられている場合、コードエディターの上の **［Back to Flow（フローに戻る）］** を選択します。
8. 新しいコマンドを「アクションの追加」パネルから、ログインフローにドラッグアンドドロップします。その後、**［適用］** を選択します。

保存後に追加の変更を行う場合、[［Actions（アクション）］>［Library（ライブラリ）］>［Custom（カスタム）］](https://manage.auth0.com/#/actions/library)に移動し、アクションを選択します。その後、必要な時にコードの更新と再導入ができます。

### ポストログインアクションをテストする

コマンドが適切に機能するように、Auth0 Dashboardを通じてアクションをテストできます:

1. [［認証］>［認証プロファイル］](https://manage.auth0.com/#/authentication-profiles)に移動します。
2. **［試す］** を選択し、新しいタブでログインプロンプトのサンプルを開きます。
3. 資格情報を入力し、新しいMFAフローをテストします。

フローが成功したら、確認画面が表示されます。問題が生じたら,、Auth0 Dashboardの[［Actions（アクション）］>［Library（ライブラリ）］>［Custom（カスタム）］](https://manage.auth0.com/#/actions/library)に移動し、コードを更新することができます。

## ユースケースの例

以下の例では、MFA登録フローをカスタマイズする際の一般的なユースケースを示しています。

### 登録に対してMFAオプションでユーザーを促す

次のサンプルでは、デフォルトで、OTPでユーザーにチャレンジを行います。必要であれば、ユーザーは「他の方法を試す」リンクにアクセスし、代わりにメールで認証することができます。

## トラブルシューティング

カスタマイズされたMFA登録でエラーや予期しない結果が発生した場合は、以下の情報を使用して問題を特定し解決するのに役立ててください。

### テナントログ

[テナントログ](/docs/ja-jp/deploy-monitor/logs)を通じて、カスタマイズされたMFA登録を監視できます。

テナントログは、Auth0 Dashboardの[［Monitoring（モニタリング）］>［Logs（ログ）］](https://manage.auth0.com/#/logs)から利用可能です。その他に、[Management API](/docs/ja-jp/api/management/v2/introduction)を使用して、ログを取得します。

予期しない動作が発生した場合は、次のイベントコードのテナントログを確認して、詳細情報を得てください。

| シナリオ                                                                                                                                                                                                            | イベント | エラーメッセージ                                                                                                                |
| --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---- | ----------------------------------------------------------------------------------------------------------------------- |
| ユーザーが特定の要素で登録することを促されます。 ところが、要求された要素は以下の1つの条件に該当しています。<br /><ul><li>要素がテナントで有効化されていない。</li><li>ユーザーのブラウザーが要素に対応していない。</li><li>ユーザーがすでに要求された要素で登録している。</li></ul>この場合、他の要素を代わりに使用できるのであれば、ユーザーはフローを完了させることができます。 | w    | PostLoginアクションではMFAの登録が使用されたものの、要求された要素である`${factor.name}`が適切にセットアップされていません。要求された要素を有効化し、ユーザーがそれを使ってすでに登録していないことを確認します。 |
| ユーザーは1つ以上の要素で登録することを促されたものの、指定された要素が登録に使用できません。この場合、ユーザーはフローを完了できません。                                                                                                                                           | mfar | PostLoginアクションではMFAの登録が使用されたものの、要求された要素が適切にセットアップされていません。MFAを実行するには、要求された要素を有効化し、ユーザーがそれらを使ってすでに登録していないことを確認します。        |
| ユーザーが既存の登録で少なくとも1つのチャレンジを完了させることなく、新しい要素で登録しようとしています。                                                                                                                                                           | mfar | MFAの登録が要求されましたが、ユーザーはすでにMFAに登録しています。新しい要素で登録する前に、少なくとも1つの既存の要素でチャレンジします。                                                |

### トラブルシューティングのチェックリスト

以下のチェックリストは、カスタマイズされたMFAフローに関する一般的な問題を特定し解決するための追加の提案を提供します。

1. **「アクションでMFA要素をカスタマイズする」** トグルを有効にする必要があります。

   * [［Auth0 Dashboard（Auth0ダッシュボード）］>［Security（セキュリティ）］>［Multi-factor Auth（多要素認証）］](https://manage.auth0.com/#/security/mfa)に移動し、［追加設定］セクションのトグルが有効になっていることを確認してください。
2. アクションで参照されるファクターは、テナントで有効にする必要があります。

   * **コードを確認する** :[［Auth0 Dashboard（Auth0ダッシュボード）］>［Actions（アクション）］>［Library（ライブラリ）］>［Custom（カスタム）］](https://manage.auth0.com/#/actions/library)に移動し、アクションコードを確認します。参照されたすべての要素が、ユースケースに適用可能であることを確認してください。
   * **要素を確認する** :[［Auth0 Dashboard（Auth0ダッシュボード）］>［Security（セキュリティ）］>［Multi-factor Auth（多要素認証）］](https://manage.auth0.com/#/security/mfa)に移動し、アクションで参照されたすべての要素が有効になっていることを確認してください。
3. アクションが導入され、パイプラインに保存されていることを確認してください。

   1. [［Auth0 Dashboard（Auth0ダッシュボード）］>［Actions（アクション）］>［Library（ライブラリ）］>［Custom（カスタム）］](https://manage.auth0.com/#/actions/library)に移動します。リストからアクションを見つけ、ステータスが **「導入済み」** になっていることを確認してください。異なるステータスが表示 されている場合、アクションにアクセスし、コードを確認したのち,右上の **［導入］** をクリックします。
   2. [［Auth0 Dashboard（Auth0ダッシュボード）］>［Actions（アクション）］>［Library（ライブラリ）］>［Flows（フロー）］](https://manage.auth0.com/#/actions/flows)に移動し、 **［ログイン］** を選択します。アクションがフローに表示されていることを確認してください。表示されていない場合、［アクションの追加］パネルの **［カスタム］タブ** にアクセスし、ログインフローにアクションをドラッグアンドドロップします。その後、**［適用］** を選択します。
4. `ポストログイン`アクションが最新バージョンにアップグレードされていることを確認してください。

   * [［Auth0 Dashboard（Auth0ダッシュボード）］>［Actions（アクション）］>［Library（ライブラリ）］>［Custom（カスタム）］](https://manage.auth0.com/#/actions/library)に移動し、アクションを選択します。アクションが古い場合、アクションの更新を促す黄色のバナーが表示されます。バナーが表示された場合、**［Update（更新）］** を選択します。
   * Deploy CLIを使用する際には、`ポストログイン`アクションの最新バージョンを指定して導入することもできます。詳しくは、[「Deploy CLIを構成する」](https://auth0.com/docs/deploy-monitor/deploy-cli-tool/configure-the-deploy-cli)をご覧ください。
