> ## 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.

> Auth0 Dashboard でカスタムデータベース接続をテストする方法を説明します。

# カスタムデータベース接続をテストする

ユーザーの保存に Auth0 ホスト型のデータベース構成を使用している場合は、同じテナントまたは別のテナントに対してユーザー認証を行うことで、その接続をテストできます。

<div id="test-with-import-users-to-auth0-enabled">
  ## Auth0 へのユーザーのインポートを有効にしてテストする
</div>

ユーザーのインポートを有効にすると、ユーザーは外部ユーザーストアから Auth0 のユーザーストアへ段階的に移行されます。この過程では、ユーザーが初回のログインに成功した際に、外部ストアに対して認証されます。以降のログイン試行はすべて、Auth0 のユーザーストアに対して行われます。詳細については、[Import and Export Users](/ja/docs/manage-users/user-migration) の自動移行に関する説明を参照してください。

<div id="create-a-test-tenant-and-application">
  ### テスト用のテナントとアプリケーションを作成する
</div>

1. Auth0 Dashboard を使用して、[新しいテナントを作成](/ja/docs/get-started/auth0-overview/create-tenants)します。
2. [Applications > Applications](https://manage.auth0.com/#/applications/applications) に移動し、[Machine-to-Machine](https://manage.auth0.com/#/applications/applications/create) アプリケーションを作成します。

   <Warning>
     カスタムデータベーススクリプトを作成するときに、**クライアントID** と **クライアントシークレット** を控えておく必要があります。Management API でスコープを有効にするには、**クライアントID** が必要です。
   </Warning>
3. このアプリケーションで、**Password** と **Client Credential** の両方のグラントを有効にします (このテストでは両方のグラントを有効にする必要があります) 。

   <Frame>
     <img src="https://mintcdn.com/translations/pvjQqAy3EB2TK6NP/docs/images/cdy7uua7fh8z/4caAveuhYurCDb5F8mdImm/38496efe6f670d828542b02a56e5ca64/Grant_Types_-_English.png?fit=max&auto=format&n=pvjQqAy3EB2TK6NP&q=85&s=0ebd711995e18f1136dab6cb1b4c78be" alt="Auth0 Dashboard > Applications > Advanced Settings" data-og-width="1602" width="1602" data-og-height="794" height="794" data-path="docs/images/cdy7uua7fh8z/4caAveuhYurCDb5F8mdImm/38496efe6f670d828542b02a56e5ca64/Grant_Types_-_English.png" data-optimize="true" data-opv="3" srcset="https://mintcdn.com/translations/pvjQqAy3EB2TK6NP/docs/images/cdy7uua7fh8z/4caAveuhYurCDb5F8mdImm/38496efe6f670d828542b02a56e5ca64/Grant_Types_-_English.png?w=280&fit=max&auto=format&n=pvjQqAy3EB2TK6NP&q=85&s=929083f5c8cace053bf64e790fd07f12 280w, https://mintcdn.com/translations/pvjQqAy3EB2TK6NP/docs/images/cdy7uua7fh8z/4caAveuhYurCDb5F8mdImm/38496efe6f670d828542b02a56e5ca64/Grant_Types_-_English.png?w=560&fit=max&auto=format&n=pvjQqAy3EB2TK6NP&q=85&s=8a9d0dcf81366ea177f0067c9bcf4e9e 560w, https://mintcdn.com/translations/pvjQqAy3EB2TK6NP/docs/images/cdy7uua7fh8z/4caAveuhYurCDb5F8mdImm/38496efe6f670d828542b02a56e5ca64/Grant_Types_-_English.png?w=840&fit=max&auto=format&n=pvjQqAy3EB2TK6NP&q=85&s=5a1181ef297ea777a38ee01a1553ccd7 840w, https://mintcdn.com/translations/pvjQqAy3EB2TK6NP/docs/images/cdy7uua7fh8z/4caAveuhYurCDb5F8mdImm/38496efe6f670d828542b02a56e5ca64/Grant_Types_-_English.png?w=1100&fit=max&auto=format&n=pvjQqAy3EB2TK6NP&q=85&s=64bebc89ee9eeb3a4dcd82289b446f34 1100w, https://mintcdn.com/translations/pvjQqAy3EB2TK6NP/docs/images/cdy7uua7fh8z/4caAveuhYurCDb5F8mdImm/38496efe6f670d828542b02a56e5ca64/Grant_Types_-_English.png?w=1650&fit=max&auto=format&n=pvjQqAy3EB2TK6NP&q=85&s=7bff613937f0e2128c19af41c0df54ad 1650w, https://mintcdn.com/translations/pvjQqAy3EB2TK6NP/docs/images/cdy7uua7fh8z/4caAveuhYurCDb5F8mdImm/38496efe6f670d828542b02a56e5ca64/Grant_Types_-_English.png?w=2500&fit=max&auto=format&n=pvjQqAy3EB2TK6NP&q=85&s=0b3caa889661bafaa2e948e38f9075c6 2500w" />
   </Frame>
4. アプリケーションを認可するには、[Applications > APIs](https://manage.auth0.com/#/apis) に移動します。
5. **Management API** を選択します。
6. **Machine-to-Machine Applications** タブで、トグルを使用してテスト用アプリケーションを認可します。
7. ドロップダウンメニューを選択し、次の Auth0 Management API スコープを有効にします。

   * `read:users`
   * `update:users`
   * `delete:users`
   * `create:users`
   * `read:users_app_metadata`
   * `update:users_app_metadata`
   * `create:users_app_metadata`

     <Frame>
       <img src="https://mintcdn.com/translations/Dcx0M11uuptU53TX/docs/images/cdy7uua7fh8z/2vW8zD1iIObuqb0i59yw77/c43bafa05b271a4343af51cb5c8ce1ce/2024-03-14_10-28-19.png?fit=max&auto=format&n=Dcx0M11uuptU53TX&q=85&s=524fd83105be99062de080acfa0a57ae" alt="Auth0 Dashboard > APIs > Management API >  M2M Tab > App Permissions" data-og-width="950" width="950" data-og-height="504" height="504" data-path="docs/images/cdy7uua7fh8z/2vW8zD1iIObuqb0i59yw77/c43bafa05b271a4343af51cb5c8ce1ce/2024-03-14_10-28-19.png" data-optimize="true" data-opv="3" srcset="https://mintcdn.com/translations/Dcx0M11uuptU53TX/docs/images/cdy7uua7fh8z/2vW8zD1iIObuqb0i59yw77/c43bafa05b271a4343af51cb5c8ce1ce/2024-03-14_10-28-19.png?w=280&fit=max&auto=format&n=Dcx0M11uuptU53TX&q=85&s=a538a06e2c001ac888b36f75f7bb6429 280w, https://mintcdn.com/translations/Dcx0M11uuptU53TX/docs/images/cdy7uua7fh8z/2vW8zD1iIObuqb0i59yw77/c43bafa05b271a4343af51cb5c8ce1ce/2024-03-14_10-28-19.png?w=560&fit=max&auto=format&n=Dcx0M11uuptU53TX&q=85&s=3b241ecba77127378d6d5ecb39b6ac51 560w, https://mintcdn.com/translations/Dcx0M11uuptU53TX/docs/images/cdy7uua7fh8z/2vW8zD1iIObuqb0i59yw77/c43bafa05b271a4343af51cb5c8ce1ce/2024-03-14_10-28-19.png?w=840&fit=max&auto=format&n=Dcx0M11uuptU53TX&q=85&s=f7d3120d1de4f8b7f7fb7ff9c7a36093 840w, https://mintcdn.com/translations/Dcx0M11uuptU53TX/docs/images/cdy7uua7fh8z/2vW8zD1iIObuqb0i59yw77/c43bafa05b271a4343af51cb5c8ce1ce/2024-03-14_10-28-19.png?w=1100&fit=max&auto=format&n=Dcx0M11uuptU53TX&q=85&s=455fd057eae3678677f94da4033eec14 1100w, https://mintcdn.com/translations/Dcx0M11uuptU53TX/docs/images/cdy7uua7fh8z/2vW8zD1iIObuqb0i59yw77/c43bafa05b271a4343af51cb5c8ce1ce/2024-03-14_10-28-19.png?w=1650&fit=max&auto=format&n=Dcx0M11uuptU53TX&q=85&s=efdc735c6febdc04a61bb9d9ec6544e5 1650w, https://mintcdn.com/translations/Dcx0M11uuptU53TX/docs/images/cdy7uua7fh8z/2vW8zD1iIObuqb0i59yw77/c43bafa05b271a4343af51cb5c8ce1ce/2024-03-14_10-28-19.png?w=2500&fit=max&auto=format&n=Dcx0M11uuptU53TX&q=85&s=4acea773a8b38758c7b4dcbaa7d3f745 2500w" />
     </Frame>

<div id="create-test-database-connections">
  ### テスト用データベース接続を作成する
</div>

Dashboard でテナントとアプリケーションを作成したら、ソースのデータベース接続とターゲットのデータベース接続を作成します。

1. ソースとして使用する新しいデータベース接続を作成するには、[Authentication > Database](https://manage.auth0.com/#/connections/database) に移動します。
2. テスト用のソース接続に名前を付け、**Requires Username** を有効にして、**Create** を選択します。

   <Callout icon="file-lines" color="#0EA5E9" iconType="regular">
     テストで使用するユーザーは、[User Management > Users](https://manage.auth0.com/#/users) に移動して作成できます。**Create** **Users** を選択して必要な項目を入力したら、**Connection** フィールドでソースデータベースを選択します。
   </Callout>
3. 手順 2 と同じ設定で、ターゲットとして使用する 2 つ目のデータベースを作成します。

   <Callout icon="file-lines" color="#0EA5E9" iconType="regular">
     テストで簡単なパスワードを使用できるように、ターゲットとソースの両方のデータベースで **Password Policy** を **Non-empty password required** に設定できます。
   </Callout>
4. ターゲットデータベースで **Custom Database** ビューに切り替え、**Use my own database** をオンにします。

   <Callout icon="file-lines" color="#0EA5E9" iconType="regular">
     カスタムデータベースで組織を使ってテストする場合は、**Context object in database scripts** を有効にします。
   </Callout>
5. **Settings** ビューに切り替え、**Import Users to Auth0** を有効にします。
6. **Custom Database** ビューに切り替えて、**Database settings** セクションを見つけます。手順 1 で作成したソースデータベースから、次の情報を追加します。

| Key               | Value                                              |
| ----------------- | -------------------------------------------------- |
| `client_id`       | 作成したアプリケーションのクライアントID。                             |
| `client_secret`   | 作成したアプリケーションのクライアントシークレット。                         |
| `auth0_domain`    | Auth0 ドメイン内のテナント名 (例: `yourTenant.us.auth0.com`) 。 |
| `source_database` | ソース接続の名前。                                          |

7. ターゲットデータベースで、[Login](/ja/docs/authenticate/database-connections/custom-db/test-custom-database-connections#login) と [Get User](/ja/docs/authenticate/database-connections/custom-db/test-custom-database-connections#get-user) のデータベースアクションスクリプトを更新します。データベースアクションスクリプトを使用する際のベストプラクティスについて詳しくは、[Custom Database Connection and Action Scripts Best Practices](/ja/docs/authenticate/database-connections/custom-db/custom-database-connections-scripts) を参照してください。
8. 各スクリプトで **Save and Try** を選択します。Actions Real-time Logs で `console.log` の出力を確認してください。詳しくは、[Actions Real-time Logs](/ja/docs/customize/actions/actions-real-time-logs) を参照してください。
9. **Try Connection** を選択して、接続をその場でテストします。

<div id="test-without-import-users-enabled">
  ## Import Users を有効にしないでテストする
</div>

1. [テスト用のテナントとアプリケーションを作成する](/ja/docs/authenticate/database-connections/custom-db/test-custom-database-connections#create-a-test-tenant-and-application) の手順を繰り返します。
2. テスト用のデータベース接続を 1 つ作成します。
3. ソースデータベース設定の **Import Users to Auth0** が無効になっていることを確認します。ユーザーはログインを試行するたびに、外部ユーザーストアで認証されます。
4. すべてのデータベース アクションスクリプトを、以下のサンプルで更新します。

<div id="get-user-script">
  ### Get User スクリプト
</div>

[Get User](/ja/docs/authenticate/database-connections/custom-db/templates/get-user) スクリプトは、ユーザーの現在の状態を判定する実行可能な関数を実装するものです。

**Import Users to Auth0** が有効な場合、Get User スクリプトは、ユーザーがサインアップを試みたときに実行され、外部ユーザーストアにそのユーザーがすでに存在するかどうかを確認します。

Get User スクリプトは、ユーザーが次のいずれかを試みた場合にも実行されます。

* ユーザーのメールアドレスを変更する ([Change Email](/ja/docs/authenticate/database-connections/custom-db/templates/change-email) スクリプト)
* ログインする ([Login](/ja/docs/authenticate/database-connections/custom-db/templates/login) スクリプト)
* ユーザーのパスワードを変更する ([Change Password](/ja/docs/authenticate/database-connections/custom-db/templates/change-password) スクリプト)

**Import Users to Auth0** が無効な場合も、Get User スクリプトは、ユーザーがサインアップを試みたときに実行され、外部ユーザーストアにそのユーザーがすでに存在するかどうかを確認します。ユーザーが外部ユーザーストアにすでに存在する場合、Create スクリプトは実行されません。

Get User スクリプトは、ユーザーが次のいずれかを試みた場合にも実行されます。

* ユーザーを作成する ([Create](/ja/docs/authenticate/database-connections/custom-db/templates/create) スクリプト)
* ユーザーのメールアドレスを変更する ([Change Email](/ja/docs/authenticate/database-connections/custom-db/templates/change-email) スクリプト)
* ユーザーのパスワードを変更する ([Change Password](/ja/docs/authenticate/database-connections/custom-db/templates/change-password) スクリプト)

<div id="example">
  #### 例
</div>

```js lines expandable theme={null}
async function getUser(user, context, callback) {
    log(`Script started.`);
    log(`Requesting an Access Token from "${configuration.auth0_domain}".`);
    let accessToken = await getAccessToken();
    accessToken = accessToken.access_token;
    if (!accessToken) return log(`Failed to get an Access Token from "${configuration.auth0_domain}".`, true);
    log(`The Access Token is available. Searching for user "${user}" in "${configuration.source_database}"`);
    user = user.toLowerCase();
    const searchQuery = encodeURI(`identities.connection:"${configuration.source_database}"+AND+(email:${user} OR username:${user})`);
    var options = {
        method: `GET`,
        url: `https://${configuration.auth0_domain}/api/v2/users?q=${searchQuery}`,
        headers: {
            Authorization: `Bearer ${accessToken}`,
        }
    };
    request(options, function (error, response) {
        if (error) return log(`Cannot connect to "${configuration.source_database}" database.`, true);
        let search_results = JSON.parse(response.body);
        let profile = null;
        if (search_results.length > 0) {
            log(`A user "${user}" is FOUND in "${configuration.source_database}" database.`);
            profile = {
                user_id: search_results[0].user_id.toString(),
                nickname: search_results[0].nickname,
                username: search_results[0].username,
                email: search_results[0].email
            };
        } else {
            log(`A user "${user}" is NOT FOUND in "${configuration.source_database}" database.`);
        }
        log(`Script completed!`);
        return callback(null, profile);
    });
    /* -- クライアントクレデンシャルでアクセストークンを取得 -- */
    async function getAccessToken() {
        var options = {
            method: `POST`,
            url: `https://${configuration.auth0_domain}/oauth/token`,
            headers: {
                "Content-Type": `application/x-www-form-urlencoded`,
            },
            form: {
                grant_type: `client_credentials`,
                client_id: configuration.client_id,
                client_secret: configuration.client_secret,
                audience: `https://${configuration.auth0_domain}/api/v2/`
            },
            json: true
        };
        return new Promise(function (resolve) {
            request(options, function (error, response) {
                resolve(error || response.body);
            });
        });
    }
    /* -- ログ記録 -- */
    function log(message, error = false) {
        const script_name = `GET USER`;
        const error_label = error ? `(ERROR)` : ``;
        const return_message = `${script_name}: ${error_label} ${message}`;
        console.log(return_message);
        if (error) return callback(new Error(return_message));
    }
}
```

<div id="login-script">
  ### ログインスクリプト
</div>

[Login](/ja/docs/authenticate/database-connections/custom-db/templates/login) スクリプトは、ユーザーのログイン時に認証を行う実行可能な関数を実装します。対象データベース (Auth0) にユーザーが存在する場合は、そのレコードを使用して認証します。存在しない場合は、ソースデータベース (外部) 内のユーザーのレコードを使用して認証します。

<div id="example">
  #### 例
</div>

```javascript lines expandable theme={null}
function login(usernameOrEmail, password, context, callback) {
  log(`Script started.`);
  const jwt = require('jsonwebtoken');
  const options = {
    method: `POST`,
    url: `https://${configuration.auth0_domain}/oauth/token`,
    headers: { "Content-Type": `application/x-www-form-urlencoded` },
    json: true,
    form: {
      grant_type: `http://auth0.com/oauth/grant-type/password-realm`,
      client_id: configuration.client_id,
      client_secret: configuration.client_secret,
      username: usernameOrEmail,
      password: password,
      realm: `${configuration.source_database}`
    }
  };
  request(options, function (error, response, body) {
    log(`Attempting to authenticate a user "${usernameOrEmail}" against "${configuration.source_database}" database in "${configuration.auth0_domain}" tenant.`);
    if (error) return log(`Cannot connect to "${configuration.auth0_domain}" database.`, true);
    if (response.statusCode !== 200) {
      console.log(`LOGIN: (ERROR) ${response.body.error_description}`);
      return callback(new WrongUsernameOrPasswordError(usernameOrEmail, `LOGIN: (ERROR) ${response.body.error_description}`));
    }
    log(`Successfuly authenticated user "${usernameOrEmail}" against "${configuration.source_database}" database in "${configuration.auth0_domain}" tenant.`);
    const decoded_id_token = jwt.decode(body.id_token);
    const profile = {
      user_id: decoded_id_token.sub,
      nickname: decoded_id_token.nickname,
      username: decoded_id_token.username,
      email: decoded_id_token.email
    };
    log(`Script completed.`);
    return callback(null, profile);
  });
  /* -- ログ記録 -- */
  function log(message, error = false) {
    const script_name = `LOGIN`;
    const error_label = error ? `(ERROR)` : ``;
    const return_message = `${script_name}: ${error_label} ${message}`;
    console.log(return_message);
    if (error) return callback(new Error(return_message));
  }
}
```

<div id="create-script">
  ### 作成スクリプト
</div>

[作成スクリプト](/ja/docs/authenticate/database-connections/custom-db/templates/create) は、ユーザーが <Tooltip tip="Universal Login: アプリケーションは、ユーザーの本人確認を行うために、Auth0 の認可サーバーでホストされる Universal Login にリダイレクトされます。" cta="用語集を見る" href="/ja/docs/glossary?term=Universal+Login">Universal Login</Tooltip> 経由でサインアップしたとき、または <Tooltip tip="Universal Login: アプリケーションは、ユーザーの本人確認を行うために、Auth0 の認可サーバーでホストされる Universal Login にリダイレクトされます。" cta="用語集を見る" href="/ja/docs/glossary?term=Auth0+Dashboard">Auth0 Dashboard</Tooltip> や Auth0 <Tooltip tip="Management API: 顧客が管理タスクを実行できるようにするための製品です。" cta="用語集を見る" href="/ja/docs/glossary?term=Management+API">Management API</Tooltip> を使用して作成されたときに、外部データベースに対応するユーザーレコードを作成する実行可能な関数を実装します。

<div id="example">
  #### 例
</div>

```js lines expandable theme={null}
async function create(user, context, callback) {
  log(`Script started.`);
  log(`Requesting an Access Token from "${configuration.auth0_domain}".`);
  let accessToken = await getAccessToken();
  if (!accessToken.access_token) return log(`Failed to get an Access Token from "${configuration.auth0_domain}".`, true);
  accessToken = accessToken.access_token;
  log(`The Access Token is available. Attempting to create a user "${user.email}" in "${configuration.source_database}"`);
  const options = {
    method: `POST`,
    url: `https://${configuration.auth0_domain}/api/v2/users`,
    headers: {
      Authorization: `Bearer ${accessToken}`,
      "Content-Type": `application/x-www-form-urlencoded`
    },
    form: {
      connection: configuration.source_database,
      email: user.email,
      password: user.password,
      username: user.username
    },
    json: true
  };
  request(options, function (error, response) {
    if (error) return log(`Cannot connect to "${configuration.source_database}" database.`, true);
    switch (response.statusCode) {
      case 201:
        log(`The user "${user.email}" is successfuly created in "${configuration.source_database}" database.`);
        return callback(null);
      case 409:
        return callback(new ValidationError(`user_exists`, `The user already exists in "${configuration.source_database}" database.`));
      default:
        return log(`Failed to create a user "${user.email}" in "${configuration.source_database}" database. Error: "${response.statusCode}, ${response.body.message}"`, true);
    }
  });
  /* -- クライアントクレデンシャルでアクセストークンを取得 -- */
  async function getAccessToken() {
    var options = {
      method: `POST`,
      url: `https://${configuration.auth0_domain}/oauth/token`,
      headers: {
        "Content-Type": `application/x-www-form-urlencoded`,
      },
      form: {
        grant_type: `client_credentials`,
        client_id: configuration.client_id,
        client_secret: configuration.client_secret,
        audience: `https://${configuration.auth0_domain}/api/v2/`
      },
      json: true
    };
    return new Promise(function (resolve) {
      request(options, function (error, response) {
        resolve(error || response.body);
      });
    });
  }
  /* -- ログ記録 -- */
  function log(message, error = false) {
    const script_name = `CREATE`;
    const error_label = error ? `(ERROR)` : ``;
    const return_message = `${script_name}: ${error_label} ${message}`;
    console.log(return_message);
    if (error) return callback(new Error(return_message));
  }
}
```

<div id="delete-script">
  ### 削除スクリプト
</div>

[削除スクリプト](/ja/docs/authenticate/database-connections/custom-db/templates/delete) では、Auth0 Dashboard または Auth0 Management API でユーザーが削除されたときに、同じ操作で Auth0 と外部データベースの両方からユーザーを削除する実行可能な関数を実装します。

<div id="example">
  #### 例
</div>

```js lines expandable theme={null}
async function deleteUser(user, context, callback) {
  log(`Script started.`);
  log(`Requesting an Access Token from "${configuration.auth0_domain}".`);
  let accessToken = await getAccessToken();
  if (!accessToken.access_token) return log(`Failed to get an Access Token from "${configuration.auth0_domain}".`, true);
  accessToken = accessToken.access_token;
  log(`The Access Token is available. Attempting to delete a user "${user}" from "${configuration.source_database}"`);
  const options = {
    method: `DELETE`,
    url: `https://${configuration.auth0_domain}/api/v2/users/${user}`,
    headers: {
      Authorization: `Bearer ${accessToken}`,
      "Content-Type": `application/x-www-form-urlencoded`
    },
    json: true
  };
  request(options, function (error, response) {
    if (error) return log(`Cannot connect to "${configuration.source_database}" database.`, true);
    switch (response.statusCode) {
      case 204:
        log(`The user "${user}" is successfuly deleted from "${configuration.source_database}" database.`);
        return callback(null);
      default:
        return log(`Failed to delete a user "${user}" from "${configuration.source_database}" database. Error: "${response.statusCode}, ${response.body.message}"`, true);
    }
  });
  /* -- クライアントクレデンシャルでアクセストークンを取得 -- */
  async function getAccessToken() {
    var options = {
      method: `POST`,
      url: `https://${configuration.auth0_domain}/oauth/token`,
      headers: {
        "Content-Type": `application/x-www-form-urlencoded`,
      },
      form: {
        grant_type: `client_credentials`,
        client_id: configuration.client_id,
        client_secret: configuration.client_secret,
        audience: `https://${configuration.auth0_domain}/api/v2/`
      },
      json: true
    };
    return new Promise(function (resolve) {
      request(options, function (error, response) {
        resolve(error || response.body);
      });
    });
  }
  /* -- ログ記録 -- */
  function log(message, error = false) {
    const script_name = `DELETE`;
    const error_label = error ? `(ERROR)` : ``;
    const return_message = `${script_name}: ${error_label} ${message}`;
    console.log(return_message);
    if (error) return callback(new Error(return_message));
  }
}
```

<div id="verify-script">
  ### Verify スクリプト
</div>

[Verify スクリプト](/ja/docs/authenticate/database-connections/custom-db/templates/verify) は、Auth0 から送信された確認メール内のリンクをユーザーがクリックしたときに、外部データベース内のユーザーのメールアドレスの確認状態を確認済みにする実行可能な関数を実装します。

<div id="example">
  #### 例
</div>

```js lines expandable theme={null}
async function verify(user, context, callback) {
  log(`Script started.`);
  log(`Requesting an Access Token from "${configuration.auth0_domain}".`);
  let accessToken = await getAccessToken();
  if (!accessToken.access_token) return log(`Failed to get an Access Token from "${configuration.auth0_domain}".`, true);
  accessToken = accessToken.access_token;
  log(`The Access Token is available. Searching for user "${user}" in "${configuration.source_database}"`);
  user = user.toLowerCase();
  const searchQuery = encodeURI(`identities.connection:"${configuration.source_database}"+AND+(email:${user} OR username:${user})`);
  var options = {
    method: `GET`,
    url: `https://${configuration.auth0_domain}/api/v2/users?q=${searchQuery}`,
    headers: {
      Authorization: `Bearer ${accessToken}`,
    }
  };
  request(options, function (error, response) {
    if (error) return log(`Cannot connect to "${configuration.source_database}" database.`, true);
    let search_results = JSON.parse(response.body);
    if (search_results.length > 0) {
      log(`A user "${user}" is found in "${configuration.source_database}" database.`);
      const user_id = search_results[0].user_id.toString();
      log(`Attempting to mark user "${user_id}" as verified in "${configuration.source_database}" database`);
      const options = {
        method: `PATCH`,
        url: `https://${configuration.auth0_domain}/api/v2/users/${user_id}`,
        headers: {
          Authorization: `Bearer ${accessToken}`,
          "Content-Type": `application/x-www-form-urlencoded`
        },
        form: {
          email_verified: true,
        },
        json: true
      };
      request(options, function (error, response) {
        if (error) return log(`Cannot connect to "${configuration.source_database}" database.`, true);
        switch (response.statusCode) {
          case 200:
            log(`The user "${user}" is marked as verified in "${configuration.source_database}" database.`);
            return callback(null, true);
          default:
            return log(`Failed to mark a user "${user}" as verified in "${configuration.source_database}" database. Error: "${response.statusCode}, ${response.body.message}"`, true);
        }
      });
    } else {
      log(`A user "${user}" is not found in "${configuration.source_database}" database. Unable to verify.`, true);
    }
  });
  /* -- クライアントクレデンシャルでアクセストークンを取得 -- */
  async function getAccessToken() {
    var options = {
      method: `POST`,
      url: `https://${configuration.auth0_domain}/oauth/token`,
      headers: {
        "Content-Type": `application/x-www-form-urlencoded`,
      },
      form: {
        grant_type: `client_credentials`,
        client_id: configuration.client_id,
        client_secret: configuration.client_secret,
        audience: `https://${configuration.auth0_domain}/api/v2/`
      },
      json: true
    };
    return new Promise(function (resolve) {
      request(options, function (error, response) {
        resolve(error || response.body);
      });
    });
  }
  /* -- ログ記録 -- */
  function log(message, error = false) {
    const script_name = `VERIFY`;
    const error_label = error ? `(ERROR)` : ``;
    const return_message = `${script_name}: ${error_label} ${message}`;
    console.log(return_message);
    if (error) return callback(new Error(return_message));
  }
}
```

<div id="change-password-script">
  ### Change Password スクリプト
</div>

[Change Password スクリプト](/ja/docs/authenticate/database-connections/custom-db/templates/change-password) は、Auth0 Dashboard または Auth0 Management API からパスワード変更ワークフローが開始された際に、外部データベース内のユーザーのパスワードを更新する実行可能関数を実装します。

<div id="example">
  #### 例
</div>

```js lines expandable theme={null}
async function changePassword(user, newPassword, context, callback) {
  log(`Script started.`);
  log(`Requesting an Access Token from "${configuration.auth0_domain}".`);
  let accessToken = await getAccessToken();
  if (!accessToken.access_token) return log(`Failed to get an Access Token from "${configuration.auth0_domain}".`, true);
  accessToken = accessToken.access_token;
  log(`The Access Token is available. Searching for user "${user}" in "${configuration.source_database}" database.`);
  user = user.toLowerCase();
  const searchQuery = encodeURI(`identities.connection:"${configuration.source_database}"+AND+(email:${user} OR username:${user})`);
  var options = {
    method: `GET`,
    url: `https://${configuration.auth0_domain}/api/v2/users?q=${searchQuery}`,
    headers: {
      Authorization: `Bearer ${accessToken}`,
    }
  };
  request(options, function (error, response) {
    if (error) return log(`Cannot connect to "${configuration.source_database}" database.`, true);
    let search_results = JSON.parse(response.body);
    if (search_results.length > 0) {
      log(`A user "${user}" is found in "${configuration.source_database}" database.`);
      const user_id = search_results[0].user_id.toString();
      log(`Attempting to change password for user "${user_id}" in "${configuration.source_database}" database.`);
      const options = {
        method: `PATCH`,
        url: `https://${configuration.auth0_domain}/api/v2/users/${user_id}`,
        headers: {
          Authorization: `Bearer ${accessToken}`,
          "Content-Type": `application/x-www-form-urlencoded`
        },
        form: {
          password: newPassword,
        },
        json: true
      };
      request(options, function (error, response) {
        if (error) return log(`Cannot connect to "${configuration.source_database}" database.`, true);
        switch (response.statusCode) {
          case 200:
            log(`The user "${user}" password successfully changed in "${configuration.source_database}" database.`);
            return callback(null, true);
          default:
            return log(`Failed to change password for "${user}"  in "${configuration.source_database}" database. Error: "${response.statusCode}, ${response.body.message}"`, true);
        }
      });
    } else {
      log(`A user "${user}" is not found in "${configuration.source_database}" database. Unable to change password.`, true);
    }
  });
  /* -- クライアントクレデンシャルでアクセストークンを取得 -- */
  async function getAccessToken() {
    var options = {
      method: `POST`,
      url: `https://${configuration.auth0_domain}/oauth/token`,
      headers: {
        "Content-Type": `application/x-www-form-urlencoded`,
      },
      form: {
        grant_type: `client_credentials`,
        client_id: configuration.client_id,
        client_secret: configuration.client_secret,
        audience: `https://${configuration.auth0_domain}/api/v2/`
      },
      json: true
    };
    return new Promise(function (resolve) {
      request(options, function (error, response) {
        resolve(error || response.body);
      });
    });
  }
  /* -- ログ記録 -- */
  function log(message, error = false) {
    const script_name = `CHANGE PASSWORD`;
    const error_label = error ? `(ERROR)` : ``;
    const return_message = `${script_name}: ${error_label} ${message}`;
    console.log(return_message);
    if (error) return callback(new Error(return_message));
  }
}
```

<div id="change-email-script">
  ### メールアドレス変更スクリプト
</div>

[Change Email](/ja/docs/authenticate/database-connections/custom-db/templates/change-email) スクリプトは、ユーザーがメールアドレスまたはその確認ステータスを変更した際に、ユーザーのメールアドレスを更新する実行可能な関数を実装します。

このスクリプトは Auth0 Dashboard では利用できません。Management API の [Update a connection](https://auth0.com/docs/api/management/v2/connections/patch-connections-by-id) エンドポイントを呼び出し、`options.customScripts.change_email` プロパティを指定する必要があります。

<div id="example">
  #### 例
</div>

```js lines expandable theme={null}
async function changeEmail(user, newEmail, verified, callback) {
  log(`Script started.`);
  log(`Requesting an Access Token from "${configuration.auth0_domain}".`);
  let accessToken = await getAccessToken();
  if (!accessToken.access_token) return log(`Failed to get an Access Token from "${configuration.auth0_domain}".`, true);
  accessToken = accessToken.access_token;
  log(`The Access Token is available. Searching for user "${user}" in "${configuration.source_database}" database.`);
  user = user.toLowerCase();
  const searchQuery = encodeURI(`identities.connection:"${configuration.source_database}"+AND+(email:${user} OR username:${user})`);
  var options = {
    method: `GET`,
    url: `https://${configuration.auth0_domain}/api/v2/users?q=${searchQuery}`,
    headers: {
      Authorization: `Bearer ${accessToken}`,
    }
  };
  request(options, function (error, response) {
    if (error) return log(`Cannot connect to "${configuration.source_database}" database.`, true);
    let search_results = JSON.parse(response.body);
    if (search_results.length > 0) {
      log(`A user "${user}" is found in "${configuration.source_database}" database.`);
      const user_id = search_results[0].user_id.toString();
      log(`Attempting to change email / verified status for user "${user_id}" in "${configuration.source_database}" database.`);
      const options = {
        method: `PATCH`,
        url: `https://${configuration.auth0_domain}/api/v2/users/${user_id}`,
        headers: {
          Authorization: `Bearer ${accessToken}`,
          "Content-Type": `application/x-www-form-urlencoded`
        },
        form: {
          email: newEmail,
          email_verified: verified || false
        },
        json: true
      };
      request(options, function (error, response) {
        if (error) return log(`Cannot connect to "${configuration.source_database}" database.`, true);
        switch (response.statusCode) {
          case 200:
            log(`The user "${user}" email / verified status successfully changed in "${configuration.source_database}" database.`);
            return callback(null, true);
          default:
            return log(`Failed to change email / verified status for "${user}"  in "${configuration.source_database}" database. Error: "${response.statusCode}, ${response.body.message}"`, true);
        }
      });
    } else {
      log(`A user "${user}" is not found in "${configuration.source_database}" database. Unable to change email / verified status.`, true);
    }
  });
  /* -- クライアントクレデンシャルによるアクセストークンの取得 -- */
  async function getAccessToken() {
    var options = {
      method: `POST`,
      url: `https://${configuration.auth0_domain}/oauth/token`,
      headers: {
        "Content-Type": `application/x-www-form-urlencoded`,
      },
      form: {
        grant_type: `client_credentials`,
        client_id: configuration.client_id,
        client_secret: configuration.client_secret,
        audience: `https://${configuration.auth0_domain}/api/v2/`
      },
      json: true
    };
    return new Promise(function (resolve) {
      request(options, function (error, response) {
        resolve(error || response.body);
      });
    });
  }
  /* -- ログ記録 -- */
  function log(message, error = false) {
    const script_name = `CHANGE EMAIL`;
    const error_label = error ? `(ERROR)` : ``;
    const return_message = `${script_name}: ${error_label} ${message}`;
    console.log(return_message);
    if (error) return callback(new Error(return_message));
  }
}
```

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

* [Auth0データベース接続のパスワード強度](/ja/docs/authenticate/database-connections/password-strength)
* [カスタムデータベース アクションスクリプト環境のベストプラクティス](/ja/docs/authenticate/database-connections/custom-db/custom-database-connections-scripts/environment)
* [Auth0データベース接続のパスワードオプション](/ja/docs/authenticate/database-connections/password-options)
* [ユーザープロファイル更新用にIDプロバイダー接続を設定する](/ja/docs/manage-users/user-accounts/user-profiles/configure-connection-sync-with-auth0)
* [接続設定のベストプラクティス](/ja/docs/authenticate/connection-settings-best-practices)
* [カスタムデータベース接続を作成する](/ja/docs/authenticate/database-connections/custom-db/create-db-connection)
