メインコンテンツへスキップ
ユーザーを作成または更新するたびに実行される Write Hook では、次のようなことができます。
  • ユーザーのパスワードを変更する
  • ユーザーのメールアドレスを変更する
  • ユーザープロファイルを更新する
また、Write Hook を使用して、新規作成されたユーザーにデフォルト値を自動的に設定することもできます。たとえば、自分に割り当てられているものと同じグループ、部門、またはベンダーに、ユーザーを自動的に割り当てることができます。
Auth0 では、データベース接続でのユーザー作成のみをサポートしています。

Hook コントラクト

  • ctx: コンテキストオブジェクト。
    • request.originalUser: 現在のユーザーの値。payload には新しいフィールドセットが含まれます。update メソッドの場合にのみ使用できます。
    • payload: ペイロードオブジェクト
      • memberships: ユーザー作成時に UI で選択されたメンバーシップの配列。
      • email: ユーザーのメールアドレス。
      • password: ユーザーのパスワード。
      • connection: データベース接続の名前。
      • app_metadata: 変更対象の Custom Field が app_metadata に保存される場合に含まれるデータ。
      • user_metadata: 変更対象の Custom Field が user_metadata に保存される場合に含まれるデータ。
    • userFields: ユーザーフィールドの配列 (settings query で指定されている場合)
    • method: create 呼び出しの結果か update 呼び出しの結果かに応じて、create または update のいずれかになります。
  • callback(error, user): エラーと、 に送信するユーザーオブジェクトを返すコールバック。
userFields の詳細については、Delegated Administration: Settings Query Hook を参照してください。

使用例

Kelly は Finance 部門を管理しています。Kelly がユーザーを作成すると、そのユーザーは Finance 部門のメンバーとして割り当てられます。
function(ctx, callback) {
  var newProfile = {
    email: ctx.payload.email,
    password: ctx.payload.password,
    connection: ctx.payload.connection,
    user_metadata: ctx.payload.user_metadata,
    app_metadata: {
      department: ctx.payload.memberships && ctx.payload.memberships[0],
      ...ctx.payload.app_metadata
    }
  };

  if (!ctx.payload.memberships || ctx.payload.memberships.length === 0) {
    return callback(new Error('The user must be created within a department.'));
  }

  // 現在のユーザーのメタデータから部署を取得します。
  var currentDepartment = ctx.request.user.app_metadata && ctx.request.user.app_metadata.department;
  if (!currentDepartment || !currentDepartment.length) {
    return callback(new Error('The current user is not part of any department.'));
  }

  // IT部署に所属していない場合、自分の部署内でのみユーザーを作成できます。
  // ITはすべての部署でユーザーを作成できます。
  if (currentDepartment !== 'IT' && ctx.payload.memberships[0] !== currentDepartment) {
    return callback(new Error('You can only create users within your own department.'));
  }

  if (ctx.method === 'update') {
    // 更新の場合、送信が必要なフィールドのみを設定します
    Object.keys(newProfile).forEach(function(key) {
      if (newProfile[key] === ctx.request.originalUser[key]) delete newProfile[key];
    });
  }

  // これがAPI v2に送信されるペイロードです。API v2でのユーザー作成方法を完全に制御できます。
  return callback(null, newProfile);
}

詳細