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

> 外部データベースでユーザーのメールアドレスを確認するためのカスタムデータベースアクションスクリプトテンプレートについて説明します。

# Verify スクリプトテンプレート

Verify スクリプトは、外部データベース内でユーザーのメールアドレスの確認ステータスを更新するために実行される関数を実装します。この関数の名前は `verify` にすることを推奨します。

このスクリプトはレガシー認証のシナリオでのみ使用され、ユーザーのメールアドレス確認をサポートするために必要です。確認済みのメールアドレスは Auth0 のさまざまなワークフローで重要であり、このスクリプトを実装することで、それらを標準でサポートできるようになります。

有効になっている場合、このスクリプトは、Auth0 から送信された確認メール内のリンクをユーザーがクリックしたときに実行されます。

<div id="verify-function">
  ## Verify 関数
</div>

`verify` 関数では、次の要件を満たす必要があります。

* 外部データベース内のユーザーのプロフィールで、`email_verified` (または同等の) 属性を更新する。
* 更新処理が成功した場合は、`true` を返す。
* 更新処理が失敗した場合は、エラーを返す。

<div id="definition">
  ### 定義
</div>

`verify` 関数は 2 つのパラメーターを受け取り、`callback` 関数を返します。

```js lines theme={null}
verify(email, callback): function
```

| パラメーター     | 型        | 説明                                    |
| ---------- | -------- | ------------------------------------- |
| `email`    | String   | ユーザーのメールアドレス。                         |
| `callback` | Function | パイプラインを介してエラーまたはプロファイルデータを渡すために使用します。 |

### 例

これは、`login` 関数の実装方法を示す擬似 JavaScript の例です。言語別の例については、[言語別のスクリプト例](/ja/docs/authenticate/database-connections/custom-db/templates/verify#language-specific-script-examples)を参照してください。

```javascript lines theme={null}
function verify(email, callback) {
  // 外部データベースAPIにメールアドレスを送信する
  let options = {
    url: "https://example.com/api/verify",
    body: {
      email: email
    }
  };

  send(options, (err) => {
    // 更新に失敗した場合はコールバックでエラーを返す
    if (err) {
      return callback(new Error(email, "My custom error message."));
    } else {
      // 更新に成功した場合はコールバックでtrueを返す
      return callback(null, true);
    }
  });
}
```

<div id="callback-function">
  ## コールバック関数
</div>

`callback` 関数は、ユーザープロファイルデータまたはエラーデータをパイプラインを通じて渡すために使用されます。

<div id="definition">
  ### 定義
</div>

`callback` 関数は、最大 2 つのパラメーターを受け取り、関数を返します。

```js lines theme={null}
callback(error, [verified]): function
```

| パラメーター     | 型       | 必須 | 説明                                                                             |
| ---------- | ------- | -- | ------------------------------------------------------------------------------ |
| `error`    | Object  | 必須 | エラーデータが含まれます。                                                                  |
| `verified` | Boolean | 任意 | 外部データベースにおけるユーザーの確認ステータスを表す値 (`true` または `false`) が含まれます。値が `true` の場合にのみ必要です。 |

<div id="return-a-success">
  ### 成功を返す
</div>

外部データベースでユーザーの確認ステータスが正常に更新された場合は、`error` パラメーターには `null` を、`verified` パラメーターには `true` を渡します。

<Warning>
  Verify スクリプトでは、`callback` 関数からどのような値が返されても、ユーザーの Auth0 プロファイル内の `email_verified` 属性の値は変更されません。

  ユーザーの Auth0 プロファイル内の `email_verified` 属性を更新するには、[Login](/ja/docs/authenticate/database-connections/custom-db/templates/login) スクリプトと [Get User](/ja/docs/authenticate/database-connections/custom-db/templates/get-user) スクリプトで返されるユーザープロファイルオブジェクトに、`email_verified` 属性とその値を含める必要があります。
</Warning>

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

```js lines theme={null}
callback(null, true);
```

<div id="return-an-error">
  ### エラーを返す
</div>

エラーが発生した場合、`error` パラメーターには問題の内容に関する情報を含める必要があります。

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

```js lines theme={null}
return callback(new Error("My custom error message."));
```

<div id="language-specific-script-examples">
  ## 言語別のスクリプト例
</div>

Auth0 では、次の言語/技術向けのサンプルスクリプトを提供しています。

* [JavaScript](#javascript)
* [ASP.NET Membership Provider (MVC3 - Universal Providers)](#asp-net-membership-provider-mvc3-universal-providers-)
* [ASP.NET Membership Provider (MVC4 - Simple Membership)](#asp-net-membership-provider-mvc4-simple-membership-)
* [MongoDB](#mongodb)
* [MySQL](#mysql)
* [PostgreSQL](#postgresql)
* [SQL Server](#sql-server)
* [Windows Azure SQL Database](#windows-azure-sql-database)

<div id="javascript">
  ### JavaScript
</div>

```javascript lines theme={null}
function verify(email, callback) {
  // このスクリプトは、現在のユーザーのメールアドレスをデータベース内で
  // 確認済みとしてマークする必要があります。
  // ユーザーがメールで送信された確認リンクをクリックするたびに実行されます。
  // これらのメールは https://manage.auth0.com/#/emails でカスタマイズできます。
  // 確認メールは（有効な場合）サインアップ成功直後に送信されるため、
  // ユーザーのメールアドレスがすでにデータベースに存在すると想定して問題ありません。
  //
  // このスクリプトの終了方法は2通りあります:
  // 1. ユーザーのメールアドレスが正常に確認された場合
  //     callback(null, true);
  // 2. データベースへの到達中に問題が発生した場合:
  //     callback(new Error("my error message"));
  //
  // エラーが返された場合、確認リンクをクリックした後にユーザーがリダイレクトされる
  // ページのクエリ文字列に渡されます。
  // 例えば、`callback(new Error("error"))` を返し、リダイレクト先を
  // https://example.com とした場合、以下のURLにリダイレクトされます:
  //     https://example.com?email=alice%40example.com&message=error&success=false
  const msg = 'Please implement the Verify script for this database connection ' +
    'at https://manage.auth0.com/#/connections/database';
  return callback(new Error(msg));
}
```

<div id="aspnet-membership-provider-mvc3-universal-providers">
  ### ASP.NET Membership Provider (MVC3 - Universal Providers)
</div>

```javascript lines expandable theme={null}
function verify(email, callback) {
  const sqlserver = require('tedious@1.11.0');
  const Connection = sqlserver.Connection;
  const Request = sqlserver.Request;
  const TYPES = sqlserver.TYPES;
  const connection = new Connection({
    userName: 'the username',
    password: 'the password',
    server: 'the server',
    options: {
      database: 'the db name',
      encrypt: true,
      // Membershipエンティティの作成に必要なuserIdを取得するために必要
      rowCollectionOnRequestCompletion: true
    }
  });
  connection.on('debug', function(text) {
    // 接続に問題がある場合は、より詳細な情報を得るためにコメントを解除してください
    //console.log(text);
  }).on('errorMessage', function(text) {
    // SQLデータベースへの接続時またはSQLステートメントのエラーが表示されます
    console.log(JSON.stringify(text));
  });
  connection.on('connect', function(err) {
    if (err) return callback(err);
    verifyMembershipUser(email, function(err, wasUpdated) {
      if (err) return callback(err); // 500を返します
      callback(null, wasUpdated);
    });
  });
  function verifyMembershipUser(email, callback) {
    // isApprovedフィールドはメールアドレス確認フラグです
    const updateMembership =
      'UPDATE Memberships SET isApproved = \'true\' ' +
      'WHERE isApproved = \'false\' AND Email = @Email';
    const updateMembershipQuery = new Request(updateMembership, function(err, rowCount) {
      if (err) {
        return callback(err);
      }
      callback(null, rowCount > 0);
    });
    updateMembershipQuery.addParameter('Email', TYPES.VarChar, email);
    connection.execSql(updateMembershipQuery);
  }
}
```

<div id="aspnet-membership-provider-mvc4-simple-membership">
  ### ASP.NET Membership Provider (MVC4 - Simple Membership)
</div>

```javascript lines expandable theme={null}
function verify (email, callback) {
  const sqlserver = require('tedious@1.11.0');
  const Connection = sqlserver.Connection;
  const Request = sqlserver.Request;
  const TYPES = sqlserver.TYPES;
  const connection = new Connection({
    userName: 'the username',
    password: 'the password',
    server: 'the server',
    options: {
      database: 'the db name',
      encrypt: true,
      // Membershipエンティティの作成に必要なuserIdを取得するために必要
      rowCollectionOnRequestCompletion: true
    }
  });
  connection.on('debug', function(text) {
    // 接続に問題がある場合は、より詳細な情報を得るためにコメントを解除してください
    //console.log(text);
  }).on('errorMessage', function(text) {
    // SQLデータベースへの接続時またはSQLステートメントのエラーが表示されます
    console.log(JSON.stringify(text));
  });
  connection.on('connect', function (err) {
    if (err) return callback(err);
    verifyMembershipUser(email, function(err, wasUpdated) {
      if (err) return callback(err); // 500を返します
      callback(null, wasUpdated);
    });
  });
  function findUserId(email, callback) {
    const findUserIdFromEmail =
      'SELECT UserProfile.UserId FROM ' +
      'UserProfile INNER JOIN webpages_Membership ' +
      'ON UserProfile.UserId = webpages_Membership.UserId ' +
      'WHERE UserName = @Username';
    const findUserIdFromEmailQuery = new Request(findUserIdFromEmail, function (err, rowCount, rows) {
      if (err || rowCount < 1) return callback(err);
      const userId = rows[0][0].value;
      callback(null, userId);
    });
    findUserIdFromEmailQuery.addParameter('Username', TYPES.VarChar, email);
    connection.execSql(findUserIdFromEmailQuery);
  }
  function verifyMembershipUser(email, callback) {
    findUserId(email, function (err, userId) {
      if (err || !userId) return callback(err);
      // isConfirmedフィールドはメールアドレス確認フラグです
      const updateMembership =
        'UPDATE webpages_Membership SET isConfirmed = \'true\' ' +
        'WHERE isConfirmed = \'false\' AND UserId = @UserId';
      const updateMembershipQuery = new Request(updateMembership, function (err, rowCount) {
        return callback(err, rowCount > 0);
      });
      updateMembershipQuery.addParameter('UserId', TYPES.VarChar, userId);
      connection.execSql(updateMembershipQuery);
    });
  }
}
```

<div id="mongodb">
  ### MongoDB
</div>

```javascript lines theme={null}
function verify (email, callback) {
  const MongoClient = require('mongodb@3.1.4').MongoClient;
  const client = new MongoClient('mongodb://user:pass@mymongoserver.com');
  client.connect(function (err) {
    if (err) return callback(err);
    const db = client.db('db-name');
    const users = db.collection('users');
    const query = { email: email, email_verified: false };
    users.update(query, { $set: { email_verified: true } }, function (err, count) {
      client.close();
      if (err) return callback(err);
      callback(null, count > 0);
    });
  });
}
```

<div id="mysql">
  ### MySQL
</div>

```javascript lines theme={null}
function verify(email, callback) {
  const mysql = require('mysql');
  const connection = mysql({
    host: 'localhost',
    user: 'me',
    password: 'secret',
    database: 'mydb'
  });
  connection.connect();
  const query = 'UPDATE users SET email_Verified = true WHERE email_Verified = false AND email = ?';
  connection.query(query, [ email ], function(err, results) {
    if (err) return callback(err);
    callback(null, results.length > 0);
  });
}
```

<div id="postgresql">
  ### PostgreSQL
</div>

```javascript lines theme={null}
function verify (email, callback) {
  //この例では "pg" ライブラリを使用しています
  //詳細はこちら: https://github.com/brianc/node-postgres
  const postgres = require('pg');
  const conString = 'postgres://user:pass@localhost/mydb';
  postgres.connect(conString, function (err, client, done) {
    if (err) return callback(err);
    const query = 'UPDATE users SET email_Verified = true WHERE email_Verified = false AND email = $1';
    client.query(query, [email], function (err, result) {
      // 注意: データベースへの接続を閉じるために
      // 必ずここで `done()` を呼び出してください
      done();
      return callback(err, result && result.rowCount > 0);
    });
  });
}
```

<div id="sql-server">
  ### SQL Server
</div>

```javascript lines expandable theme={null}
function verify (email, callback) {
  //この例では "tedious" ライブラリを使用しています
  //詳細はこちら: http://pekim.github.io/tedious/index.html
  const sqlserver = require('tedious@1.11.0');
  const Connection = sqlserver.Connection;
  const Request = sqlserver.Request;
  const TYPES = sqlserver.TYPES;
  const connection = new Connection({
    userName:  'test',
    password:  'test',
    server:    'localhost',
    options:  {
      database: 'mydb'
    }
  });
  const query = 'UPDATE dbo.Users SET Email_Verified = true WHERE Email_Verified = false AND Email = @Email';
  connection.on('debug', function(text) {
    console.log(text);
  }).on('errorMessage', function(text) {
    console.log(JSON.stringify(text, null, 2));
  }).on('infoMessage', function(text) {
    console.log(JSON.stringify(text, null, 2));
  });
  connection.on('connect', function (err) {
    if (err) return callback(err);
    const request = new Request(query, function (err, rows) {
      if (err) return callback(err);
      callback(null, rows > 0);
    });
    request.addParameter('Email', TYPES.VarChar, email);
    connection.execSql(request);
  });
}
```

<div id="windows-azure-sql-database">
  ### Windows Azure SQL Database
</div>

```javascript lines expandable theme={null}
function verify (email, callback) {
  //この例では "tedious" ライブラリを使用しています
  //詳細はこちら: http://pekim.github.io/tedious/index.html
  var Connection = require('tedious@1.11.0').Connection;
  var Request = require('tedious@1.11.0').Request;
  var TYPES = require('tedious@1.11.0').TYPES;
  var connection = new Connection({
    userName:  'your-user@your-server-id.database.windows.net',
    password:  'the-password',
    server:    'your-server-id.database.windows.net',
    options:  {
      database: 'mydb',
      encrypt:  true
    }
  });
  var query =
    'UPDATE Users SET Email_Verified=\'TRUE\' ' +
    'WHERE Email_Verified=\'FALSE\' AND Email=@Email';
  connection.on('debug', function(text) {
    // デバッグメッセージを有効にするには、次の行のコメントを解除してください
    // console.log(text);
  }).on('errorMessage', function(text) {
    console.log(JSON.stringify(text, null, 2));
  }).on('infoMessage', function(text) {
    // 情報メッセージを有効にするには、次の行のコメントを解除してください
    // console.log(JSON.stringify(text, null, 2));
  });
  connection.on('connect', function (err) {
    if (err) { return callback(err); }
    var request = new Request(query, function (err, rows) {
      if (err) { return callback(err); }
      console.log('rows: ' + rows);
      callback(null, rows > 0);
    });
    request.addParameter('Email', TYPES.VarChar, email);
    connection.execSql(request);
  });
}
```

<div id="learn-more">
  ## 詳しくはこちら
</div>

* [ログイン用スクリプトテンプレート](/ja/docs/authenticate/database-connections/custom-db/templates/login)
* [ユーザー取得用スクリプトテンプレート](/ja/docs/authenticate/database-connections/custom-db/templates/get-user)
* [作成用スクリプトテンプレート](/ja/docs/authenticate/database-connections/custom-db/templates/create)
* [削除用スクリプトテンプレート](/ja/docs/authenticate/database-connections/custom-db/templates/delete)
* [パスワード変更用スクリプトテンプレート](/ja/docs/authenticate/database-connections/custom-db/templates/change-password)
* [メールアドレス変更用スクリプトテンプレート](/ja/docs/authenticate/database-connections/custom-db/templates/change-email)
