Saltar al contenido principal
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.

Función verify

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

Definición

La función verify acepta dos parámetros y devuelve una función de callback:
verify(email, callback): function
ParámetroTipoDescripción
emailStringDirección de correo electrónico del usuario.
callbackFunctionSe 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.
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);
    }
  });
}

Función de callback

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

Definición

La función callback acepta hasta dos parámetros y devuelve una función:
callback(error, [verified]): function
ParámetroTipoObligatorioDescripción
errorObjectObligatorioContiene datos de error.
verifiedBooleanOpcionalContiene 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.

Indique que la operación se realizó correctamente

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.
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 y Get User.

Ejemplo

callback(null, true);

Devolver un error

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

Ejemplo

return callback(new Error("My custom error message."));

Ejemplos de scripts específicos de cada lenguaje

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

JavaScript

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));
}

Proveedor de membresía de ASP.NET (MVC3 - Proveedores universales)

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);
  }
}

Proveedor de membresía de ASP.NET (MVC4 - Simple Membership)

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);
    });
  }
}

MongoDB

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);
    });
  });
}

MySQL

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);
  });
}

PostgreSQL

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);
    });
  });
}

SQL Server

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);
  });
}

Base de datos SQL de Windows Azure

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);
  });
}

Más información