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

> Delegated Administration 拡張機能で Write Hook を使用する方法を説明します。

# Delegated Administration: Write Hook

ユーザーを作成または更新するたびに実行される Write Hook では、次のようなことができます。

* ユーザーのパスワードを変更する
* ユーザーのメールアドレスを変更する
* ユーザープロファイルを更新する

また、Write Hook を使用して、新規作成されたユーザーにデフォルト値を自動的に設定することもできます。たとえば、自分に割り当てられているものと同じグループ、部門、またはベンダーに、ユーザーを自動的に割り当てることができます。

<Warning>
  Auth0 では、データベース接続でのユーザー作成のみをサポートしています。
</Warning>

<div id="hook-contract">
  ## Hook コントラクト
</div>

* **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)**: エラーと、<Tooltip tip="Management API: お客様が管理タスクを実行するための製品です。" cta="用語集を表示" href="/ja/docs/glossary?term=Management+API">Management API</Tooltip> に送信するユーザーオブジェクトを返すコールバック。

**userFields** の詳細については、[Delegated Administration: Settings Query Hook](/ja/docs/customize/extensions/delegated-administration-extension/delegated-administration-hooks/delegated-administration-settings-query-hook) を参照してください。

<div id="sample-use">
  ## 使用例
</div>

Kelly は Finance 部門を管理しています。Kelly がユーザーを作成すると、そのユーザーは Finance 部門のメンバーとして割り当てられます。

```javascript lines expandable theme={null}
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);
}
```

<div id="learn-more">
  ## 詳細
</div>

* [Delegated Administration: Access Hook](/ja/docs/customize/extensions/delegated-administration-extension/delegated-administration-hooks/delegated-administration-access-hook)
* [Delegated Administration: Filter Hook](/ja/docs/customize/extensions/delegated-administration-extension/delegated-administration-hooks/delegated-administration-filter-hook)
* [Delegated Administration: Memberships Query Hook](/ja/docs/customize/extensions/delegated-administration-extension/delegated-administration-hooks/delegated-administration-memberships-query-hook)
* [Delegated Administration: Settings Query Hook](/ja/docs/customize/extensions/delegated-administration-extension/delegated-administration-hooks/delegated-administration-settings-query-hook)
