ログイン後のアクショントリガーでユーザーメタデータを管理する

Auth0は豊富なシステムを提供して、Auth0ユーザープロファイルにメタデータを保管できるようにしています。post-loginトリガーを構成すると、user_metadataapp_metadataをユーザーのログインフローの一部として変更できるようになります。ログイン後のトリガーは、ユーザープロファイルにアプリケーション固有のデータを保存したり、ユーザー操作ログをキャプチャしたり、SAML属性をメタデータフィールドにマッピングしたり、ユーザープロファイルにあるコストのかかる操作値をキャッシュして今後のログインに再利用したりなどの作業に役立ちます。

post-loginapiオブジェクトには、このトリガーで実行できる一般的な操作があります。ユーザーメタデータを管理するには、api.user.setAppMetadataメソッドとapi.user.setUserMetadataメソッドを使用します。たとえば、特定のユーザーに何らかの動作が複数回にわたって実行されるのを防ぐには、以下のようなアクションを検討します。

exports.onExecutePostLogin = async (event, api) => {
  if (event.user.app_metadata.didAnExpensiveTask) {
    console.log(`Skipping the expensive task because it already occurred for ${event.user.email}.`);
    return;
  }
  // do and expensive task
  api.user.setAppMetadata("didAnExpensiveTask", true);
};

Was this helpful?

/

ここでは、アクションの初めに、ユーザーに高コストなタスクがすでに実行されているかの確認を追加しています。メタデータフィールドが存在する場合は、関数から戻ります。

アクションの終わりに、api.user.setAppMetadataを呼び出して、ユーザーオブジェクトにある一部のメタデータを保存したいと示します。各トリガーの実行終了時に、アクションはユーザープロファイルを単一操作で更新します。setUserMetadataアクションが複数回呼び出された場合(同じフローの異なるアクションで呼び出された場合であっても)、ユーザープロファイルの更新はトリガーの実行が終わったときの1回だけになります。

ベストプラクティス

Auth0のプロファイルに保管するデータは多すぎないようにします。このデータは、認証と認可に使用されることを目的としています。ユーザーが自分のuser_metadataフィールドを編集できるため、機微データを保管してはいけません。Auth0のメタデータと検索機能は、市場調査や高い検索・更新の頻度が必要なものを想定して設計されていません。Auth0をそのような目的で使用すると、ほぼ確実にシステムの拡張性や性能に問題が生じます。データを外部システムに保管して、Auth0にポインター(ユーザーID)を保管した方が、バックエンドシステムが必要に応じてデータを取得できます。

レート制限

1回の呼び出しでユーザープロファイルを更新する場合でも、その操作はテナントの「ユーザー書き込み」レート制限の対象となります。メタデータの更新中にレート制限に達した場合は、429 HTTPステータスコードが返される限り、アクションは要求を再試行します。再試行間の遅延は、429応答の一部として返されるX-RateLimit-Resetヘッダーの値によって決まります。

リダイレクト

api.redirect.sendUserTo()でリダイレクトが行われる場合には、保留中のユーザーやアプリのメタデータ更新がユーザープロファイルに適用されてから、ユーザーが外部サイトにリダイレクトされます。詳細については、「アクションを使用してリダイレクトする」を参照してください。

もっと詳しく