Auth0でサインアップ 時にカスタムuser_metadataを追加する

2020.08.17

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

Auth0のRulesを使ってユーザープロファイルに情報を追加したり、ホワイトリストを保持し、メールに基づいてアクセスを拒否したり、ログインイベントを別システムに通知したりすることは多いです。

Ruleはユーザーがアプリケーションに対して認証するときに実行されるJavaScript関数で、認証プロセスが完了すると実行されます。

ということは、認証の前に行われるイベントに対しては実行されないということです(サインアップなど)。

実際に体験したケースですが、

Auth0から送信されるメールを多言語化したい。多言語化するためにuser_metadataのlocaleを使って言語切り替えを行う。

このケースだと、email のテンプレートに以下のようなコードを追加することで可能となります。

{% if user.user_metadata.locale == 'ja' %}
  やあ {{ user.name }}, ...
{% elsif user.user_metadata.locale == 'it' %}
  Ciao {{ user.name }}, ...
{% else %}
  Hi {{ user.name }}, ...
{% endif %}

Ruleを使ってuser_metadataにlocaleを追加していると多言語化されないメールが出てきました。 それは、Verification Email (Using Link)で、 ユーザーのメールアドレスを確認するために送信されるメールです。 このメールはサインアップ時(Auth0のデータベース接続を利用する場合)に送信されるので、Ruleでlocaleを追加していたらテンプレートでlocaleの判定ができません。

こういった場合はHooksという機能を使って対応することが可能です。

HooksはAuth0プラットフォームの選択された拡張ポイントに対して実行されたときのAuth0の動作をカスタマイズ機能です。 カスタムNode.jsコードを実行することにより拡張することになります。

データベース接続かパスワードレス接続でのみ機能するので注意が必要です(拡張ポイントによって異なる)。

以下の拡張ポイントが提供されています。

  • Client Credentials Exchange
    • machine-to-machineのトークン交換を拡張。トークン交換を防止したり、Auth0 API の POST /oauth/token エンドポイントで発行されたトークンにアクセスするためのスコープを変更したり、カスタムクレームを追加したりすることができます
  • Pre-User Registration
    • ユーザーの作成または登録を禁止するか、新しく作成したユーザーにカスタムメタデータを追加
  • Post-User Registration
    • 新しいユーザーが作成または登録され、データベースに追加された後、Auth0認証プロセスからカスタムアクションを実装
  • Post-Change Password
    • ユーザーパスワードの変更が成功した後に実行するカスタムアクションを実装
  • Send Phone Message
    • MFAの使い捨てコードを配信するカスタムSMSプロバイダーを実装

Auth0から送られるメールを多言語化するためにuser_metadataに情報を追加するのであれば、Pre-User Registrationの拡張ポイントを使用します。

コード例:ユニバーサルログイン画面の言語をユーザーの言語として登録する場合

/**
@param {object} user - The user being created
@param {string} user.tenant - Auth0 tenant name
@param {string} user.username - user name
@param {string} user.password - user's password
@param {string} user.email - email
@param {boolean} user.emailVerified - is e-mail verified?
@param {string} user.phoneNumber - phone number
@param {boolean} user.phoneNumberVerified - is phone number verified?
@param {object} context - Auth0 connection and other context info
@param {string} context.renderlanguage - language used by signup flow
@param {string} context.request.ip - ip address
@param {string} context.request.language - language of the client agent
@param {object} context.connection - information about the Auth0 connection
@param {object} context.connection.id - connection id
@param {object} context.connection.name - connection name
@param {object} context.connection.tenant - connection tenant
@param {object} context.webtask - webtask context
@param {function} cb - function (error, response)
*/
module.exports = function (user, context, cb) {
  var user_lang = "";
  // サインアップのフローの言語を使う場合
  user_lang = context.renderLanguage || "en";

  var response = {};
  response.user = {
    user_metadata: { locale: user_lang, score:777, vip: true },
  };

  // 完了を通知するために必要(cb関数)
  cb(null, response);
};

Hooksの編集画面で書いたコードをテスト実行することもできます。

Ruleと同じくAuth0のデフォルトフローを拡張できるといった点で強力な機能となります。 サインアップ時にuser_metadataの追加、一時的にサインアップを停止したいといったこともあるかと思います。 そういった時はHooksという機能を有効に活用していきたいですね。