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

> Describe las plantillas de scripts de acción de base de datos personalizada para la verificación del correo electrónico del usuario.

# Plantillas del script Verify

El script Verify implementa la función que se ejecuta para marcar el estado de verificación de la dirección de correo electrónico de un usuario en una base de datos externa. Recomendamos llamar a esta función `verify`.

Este script solo se utiliza en escenarios de autenticación heredada y es necesario para admitir la verificación de la dirección de correo electrónico del usuario. Una dirección de correo electrónico verificada es fundamental para varios flujos de trabajo en Auth0, e implementar este script proporciona compatibilidad con ellos de forma predeterminada.

Si está habilitado, este script se ejecuta cuando un usuario hace clic en el enlace del correo electrónico de verificación enviado por Auth0.

<div id="verify-function">
  ## Función `verify`
</div>

La función `verify` debe:

* Actualizar el atributo `email_verified` (o su equivalente) en el perfil del usuario en la base de datos externa.
* Devolver `true` si la actualización se realizó correctamente.
* Devolver un error si la actualización falló.

<div id="definition">
  ### Definición
</div>

La función `verify` acepta dos parámetros y devuelve una función de `callback`:

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

| Parámetro  | Tipo     | Descripción                                                                     |
| ---------- | -------- | ------------------------------------------------------------------------------- |
| `email`    | String   | Dirección de correo electrónico del usuario.                                    |
| `callback` | Function | Se utiliza para pasar errores o datos del perfil por el flujo de procesamiento. |

### Ejemplo

Este es un ejemplo en pseudo-JavaScript de cómo podría implementar la función `login`. Para ver ejemplos específicos de cada lenguaje, consulte [Ejemplos de scripts específicos de cada lenguaje](/es/docs/authenticate/database-connections/custom-db/templates/verify#language-specific-script-examples).

```javascript lines theme={null}
function verify(email, callback) {
  // Enviar correo electrónico a la API de base de datos externa
  let options = {
    url: "https://example.com/api/verify",
    body: {
      email: email
    }
  };

  send(options, (err) => {
    // Devolver error en el callback si la actualización falló
    if (err) {
      return callback(new Error(email, "My custom error message."));
    } else {
      // Devolver true en el callback si la actualización fue exitosa
      return callback(null, true);
    }
  });
}
```

<div id="callback-function">
  ## Función de callback
</div>

La función `callback` se usa para pasar datos del perfil del usuario o datos de error a través del flujo.

<div id="definition">
  ### Definición
</div>

La función `callback` acepta hasta dos parámetros y devuelve una función:

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

| Parámetro  | Tipo    | Obligatorio | Descripción                                                                                                                                                       |
| ---------- | ------- | ----------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `error`    | Object  | Obligatorio | Contiene datos de error.                                                                                                                                          |
| `verified` | Boolean | Opcional    | Contiene un valor que representa el estado de verificación del usuario en la base de datos externa (`true` o `false`). Solo es obligatorio si el valor es `true`. |

<div id="return-a-success">
  ### Indique que la operación se realizó correctamente
</div>

Si el estado de verificación del usuario se actualizó correctamente en la base de datos externa, pase un valor `null` para el parámetro `error` y un valor `true` para el parámetro `verified`.

<Warning>
  El script Verify no cambia el valor del atributo `email_verified` en el perfil de Auth0 del usuario, independientemente del valor que devuelva la función `callback`.

  Para actualizar el atributo `email_verified` en el perfil de Auth0 del usuario, debe incluir el atributo `email_verified` y su valor en el objeto de perfil del usuario que devuelven los scripts [Login](/es/docs/authenticate/database-connections/custom-db/templates/login) y [Get User](/es/docs/authenticate/database-connections/custom-db/templates/get-user).
</Warning>

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

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

<div id="return-an-error">
  ### Devolver un error
</div>

Si se produce un error, el parámetro `error` debe contener información relevante sobre el problema.

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

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

<div id="language-specific-script-examples">
  ## Ejemplos de scripts específicos de cada lenguaje
</div>

Auth0 proporciona scripts de ejemplo para usarlos con los siguientes lenguajes/tecnologías:

* [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)
* [Base de datos SQL de Windows Azure](#windows-azure-sql-database)

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

```javascript lines theme={null}
function verify(email, callback) {
  // Este script debe marcar el correo electrónico del usuario actual como verificado en
  // su base de datos.
  // Se ejecuta cada vez que un usuario hace clic en el enlace de verificación enviado por correo electrónico.
  // Estos correos electrónicos se pueden personalizar en https://manage.auth0.com/#/emails.
  // Puede asumirse que el correo electrónico del usuario ya existe en su base de datos,
  // ya que los correos electrónicos de verificación, si están habilitados, se envían inmediatamente después de
  // un registro exitoso.
  //
  // Hay dos formas en que este script puede finalizar:
  // 1. El correo electrónico del usuario se verificó correctamente
  //     callback(null, true);
  // 2. Algo salió mal al intentar acceder a su base de datos:
  //     callback(new Error("my error message"));
  //
  // Si se devuelve un error, se pasará a la cadena de consulta de la página
  // a la que se redirige al usuario tras hacer clic en el enlace de verificación.
  // Por ejemplo, devolver `callback(new Error("error"))` y redirigir a
  // https://example.com redirigirá a la siguiente 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">
  ### Proveedor de membresía de ASP.NET (MVC3 - Proveedores universales)
</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,
      // Necesario para recuperar el userId requerido para la creación de la entidad Membership
      rowCollectionOnRequestCompletion: true
    }
  });
  connection.on('debug', function(text) {
    // si tiene problemas de conexión, descomente esto para obtener información más detallada
    //console.log(text);
  }).on('errorMessage', function(text) {
    // esto mostrará cualquier error al conectarse a la base de datos SQL o con las sentencias 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); // esto devolverá un 500
      callback(null, wasUpdated);
    });
  });
  function verifyMembershipUser(email, callback) {
    // el campo isApproved es el indicador de verificación de correo electrónico
    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">
  ### Proveedor de membresía de ASP.NET (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,
      // Necesario para recuperar el userId requerido para la creación de la entidad Membership
      rowCollectionOnRequestCompletion: true
    }
  });
  connection.on('debug', function(text) {
    // si tienes problemas de conexión, descomenta esto para obtener información más detallada
    //console.log(text);
  }).on('errorMessage', function(text) {
    // esto mostrará cualquier error al conectarse a la base de datos SQL o con las sentencias 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); // esto devolverá un 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);
      // el campo isConfirmed es el indicador de verificación de correo electrónico
      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) {
  //este ejemplo usa la librería "pg"
  //más información aquí: 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) {
      // NOTA: siempre llama a `done()` aquí para cerrar
      // la conexión a la base de datos
      done();
      return callback(err, result && result.rowCount > 0);
    });
  });
}
```

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

```javascript lines expandable theme={null}
function verify (email, callback) {
  //este ejemplo usa la biblioteca "tedious"
  //más información aquí: 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">
  ### Base de datos SQL de Windows Azure
</div>

```javascript lines expandable theme={null}
function verify (email, callback) {
  //este ejemplo usa la biblioteca "tedious"
  //más información aquí: 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) {
    // Descomenta la siguiente línea para habilitar los mensajes de depuración
    // console.log(text);
  }).on('errorMessage', function(text) {
    console.log(JSON.stringify(text, null, 2));
  }).on('infoMessage', function(text) {
    // Descomenta la siguiente línea para habilitar los mensajes de información
    // 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">
  ## Más información
</div>

* [Plantillas de scripts de inicio de sesión](/es/docs/authenticate/database-connections/custom-db/templates/login)
* [Plantillas de scripts de obtención de usuarios](/es/docs/authenticate/database-connections/custom-db/templates/get-user)
* [Plantillas de scripts de creación](/es/docs/authenticate/database-connections/custom-db/templates/create)
* [Plantillas de scripts de eliminación](/es/docs/authenticate/database-connections/custom-db/templates/delete)
* [Plantillas de scripts de cambio de contraseña](/es/docs/authenticate/database-connections/custom-db/templates/change-password)
* [Plantilla de script de cambio de correo electrónico](/es/docs/authenticate/database-connections/custom-db/templates/change-email)
