メインコンテンツへスキップ
Login トリガーは、ユーザーが Auth0 テナント内のアプリケーションに対する認証に成功したときに実行されます。これには、サインアップ後の認証も含まれます。
Actions の Login フローを示す図。
このトリガー内の Actions はブロッキング (同期) です。つまり、トリガーの処理の一部として実行され、Action が完了するまで Auth0 パイプラインの後続の処理は実行されません。

トリガー

Login / Post Login

post-login トリガーは、ユーザーのログイン後、および の交換時に実行される関数です。

参考資料

よくあるユースケース

アクセス制御

アプリケーションへのアクセスを試みるユーザーのアクセスを拒否するカスタムロジックを実装するには、post-login Action を使用できます。
/**
 * @param {Event} event - ユーザーとログイン時のコンテキストに関する詳細情報。
 * @param {PostLoginAPI} api - ログインの動作を変更するために使用できるメソッドを持つインターフェース。
 */
exports.onExecutePostLogin = async (event, api) => {
  if (event.user.email && event.user.email.endsWith("@example.com") && event.client.name === "My SPA") {
    api.access.deny(`Access to ${event.client.name} is not allowed.`);
  }
};

特定のアプリケーションへのアクセスを平日のみに制限する

特定のアプリケーションへのアクセスを平日のみにしたい場合は、次の Action を作成します。
/**
 * @param {Event} event - ユーザーとログイン時のコンテキストに関する詳細情報。
 * @param {PostLoginAPI} api - ログインの動作を変更するために使用できるメソッドを持つインターフェース。
 */
 exports.onExecutePostLogin = async (event, api) => {
  if (event.client.name === "APP_NAME") {
    const d = new Date().getDay();

    if (d === 0 || d === 6) {
      api.access.deny("This app is only available during the week.");
    }
  }
}

API を呼び出すすべてのユーザーのアクセスを拒否する

API を呼び出すすべてのユーザーのアクセスを拒否したいとします。つまり、API の  値に応じてアクセスを拒否する必要があります。この値は、Dashboard > Applications > APIs にある API の API Audience フィールドで確認できます。これを行うには、次の Action を作成します。
/**
 * @param {Event} event - ユーザーとログイン時のコンテキストに関する詳細情報。
 * @param {PostLoginAPI} api - ログインの動作を変更するために使用できるメソッドを持つインターフェース。
 */
 exports.onExecutePostLogin = async (event, api) => {
  // Actions では、API はリソースサーバーと呼ばれます。
  if (event.resource_server && event.resource_server.identifier === "http://todoapi2.api") {
    api.access.deny("end_users_not_allowed");
  }
}

ID トークンとアクセストークンにユーザーロールを追加する

Auth0 が発行するトークンにユーザーロールを追加するには、event.authorization オブジェクトと api.idToken.setCustomClaim メソッドおよび api.accessToken.setCustomClaim メソッドを使用します。
/**
 * @param {Event} event - ユーザーとログイン時のコンテキストに関する詳細。
 * @param {PostLoginAPI} api - ログインの動作を変更するために使用できるメソッドを持つインターフェース。
 */
exports.onExecutePostLogin = async (event, api) => {
  const namespace = 'https://my-app.example.com';
  if (event.authorization) {
    api.idToken.setCustomClaim(`${namespace}/roles`, event.authorization.roles);
    api.accessToken.setCustomClaim(`${namespace}/roles`, event.authorization.roles);
  }
}
  • カスタムクレームには特定の用語を含めることはできません。また、URI 形式の名前空間付きクレームを使用することを強く推奨します。詳しくは、カスタムクレームに関するドキュメントを参照してください。
  • リクエスト元のアプリケーションに返される は、トリガー処理の最後に生成され、署名されます。最終的に署名された JWT には、Action からはアクセスできません。

ユーザープロフィールを拡張する

Auth0 は、ユーザープロフィール にメタデータを保存するための仕組みを提供しています。ログイン時にユーザープロフィールの user_metadata または app_metadata を設定するには、api.user.setUserMetadata または api.user.setAppMetadata 関数を使用します。
/**
 * @param {Event} event - ユーザーとログイン時のコンテキストに関する詳細情報。
 * @param {PostLoginAPI} api - ログインの動作を変更するために使用できるメソッドを持つインターフェース。
 */
exports.onExecutePostLogin = async (event, api) => {
  api.user.setUserMetadata("favorite_color", "blue");
};
すべてのpost-login Actionの実行が完了すると、Actionsはユーザープロフィールを1回の操作で更新します。この操作には、“Write Users” レート制限 が適用されます。

カスタム MFA ポリシーを適用する

post-login Action を使用すると、アプリケーションの要件に応じて、ユーザーに を動的に要求できます。
/**
 * @param {Event} event - ユーザーおよびログイン時のコンテキストに関する詳細情報。
 * @param {PostLoginAPI} api - ログインの動作を変更するために使用できるメソッドを持つインターフェース。
 */
exports.onExecutePostLogin = async (event, api) => {
  // 北米からログインするすべてのユーザーに MFA を要求する。
  if (event.request.geoip.continentCode === "NA") {
    api.multifactor.enable("any");
  };
};
ログイン時にMFAを有効にするには、MFAプロバイダーを設定する必要があります。詳細については、多要素認証を参照してください。

パスキーで手間を軽減する

post-login Action を使用すると、パスキーで認証したユーザーについて、MFA を動的にスキップしてログイン時の負担を軽減できます。
/**
* PostLogin フローの実行中に呼び出されるハンドラー。
*
* @param {Event} event - ユーザーおよびログインコンテキストの詳細。
* @param {PostLoginAPI} api - ログインの動作を変更するために使用できるメソッドを持つインターフェース。
*/
exports.onExecutePostLogin = async (event, api) => {
 // パスキーが認証に使用されたかどうかを確認する
 const skipMFA = event.authentication?.methods.some(
   (method) => method.name === "passkey"
 );

 // パスキーが使用された場合は MFA をスキップする
 if (skipMFA) {
   api.multifactor.enable("none");
 }
};
接続でパスキーとMFAが有効になっている必要があります。詳細については、Passkeys および 多要素認証 を参照してください。

ユーザーを外部サイトにリダイレクトする

Redirect Rules と同様に、post-login Action を使用してユーザーを外部サイトにリダイレクトできます。完了後、ユーザーは Auth0 にリダイレクトされて戻り、ログインフローを続行できます。以下の例では、ユーザーに好きな色を入力してもらうために Redirect Action を使用しています。
/**
 * @param {Event} event - Details about the user and the context in which they are logging in.
 * @param {PostLoginAPI} api - Interface whose methods can be used to change the behavior of the login.
 */
exports.onExecutePostLogin = async (event, api) => {
  // Skip the redirect if the user has already chosen a favorite color.
  if (event.user.user_metadata.favorite_color) {
    return;
  }

  const token = api.redirect.encodeToken({
    secret: event.secrets.MY_SHARED_SECRET,
    payload: {
      email: event.user.email,
    },
  });

  // Send the user to https://my-app.example.com along
  // with a `session_token` query string param.
  api.redirect.sendUserTo("https://my-app.example.com", { 
    query: { session_token: token }
  });
};

/**
 * @param {Event} event - ユーザーとログイン時のコンテキストに関する詳細。
 * @param {PostLoginAPI} api - ログインの動作を変更するために使用できるメソッドを持つインターフェース。
 */
exports.onContinuePostLogin = async (event, api) => {
  // /continue エンドポイントが呼び出されたら、署名済みトークンを展開し、
  // お気に入りの色をユーザーメタデータとして保存する。

  const payload = api.redirect.validateToken({
    secret: event.secrets.MY_SHARED_SECRET,
  });

  api.user.setUserMetadata("favorite_color", payload.favorite_color);
};
ユーザーがリダイレクトされている間、Actions パイプラインは一時停止されます。ユーザーが Auth0 のログインプロセスを続行すると、Actions パイプラインは停止された箇所から再開されます。リダイレクト前に実行された Action は再実行されません。 Redirect Actions の詳細については、Actions を使用したリダイレクト を参照してください。

アクセストークンのスコープを変更する

に関連付けられたスコープを変更する場合は、オーディエンスの指定に関するベストプラクティスに従ってください。
  • スコープを追加する前に、必ず想定しているオーディエンスであることを確認してください。
  • スコープを追加する際に、信頼できない入力を使用しないでください。
/**
 * @param {Event} event - ユーザーおよびログイン時のコンテキストに関する詳細情報。
 * @param {PostLoginAPI} api - ログインの動作を変更するために使用できるメソッドを持つインターフェース。
 */
exports.onExecutePostLogin = async (event, api) => {
  if (event?.resource_server?.identifier === 'https://example.com/api') {
    api.accessToken.addScope("read:xyz");
  }
};

特定の JA3/JA4 フィンガープリントからのアクセスを拒否する

event.security_context オブジェクトには、現在のトランザクションの JA3/JA4 フィンガープリント値が含まれています。
exports.onExecutePreUserRegistration = async (event, api) => {
  const clientJa4 = event?.security_context?.ja4;
  console.log('[ACTION]', {clientJa4});
  const badFingerprints = ['t13d1517h2_8daaf6152771_b6f405a00624','t13d1516h2_8daaf6152771_d8a2da3f94cd'];
  if (clientJa4 && badFingerprints.includes(clientJa4)){
    api.access.deny('suspicious_tls_fingerprint', 'Your TLS fingerprint has been flagged as suspicious');
  }
};

詳細情報