Passer au contenu principal
Le script Verify implémente la fonction exécutée pour indiquer l’état de vérification du courriel d’un utilisateur dans une base de données externe. Nous recommandons de nommer cette fonction verify. Ce script est utilisé uniquement dans les scénarios d’authentification hérités et il est nécessaire pour prendre en charge la vérification du courriel de l’utilisateur. Une adresse courriel vérifiée est essentielle à plusieurs flux de travail dans Auth0, et l’implémentation de ce script ajoute cette prise en charge d’emblée. S’il est activé, ce script s’exécute lorsqu’un utilisateur clique sur le lien contenu dans le courriel de vérification envoyé par Auth0.

Fonction verify

La fonction verify doit :
  • Mettre à jour l’attribut email_verified (ou son équivalent) dans le profil de l’utilisateur de la base de données externe.
  • Retourner true si la mise à jour a réussi.
  • Retourner une erreur si la mise à jour a échoué.

Définition

La fonction verify accepte deux paramètres et retourne une fonction callback :
verify(email, callback): function
ParamètreTypeDescription
emailStringAdresse de courriel de l’utilisateur.
callbackFunctionPermet de transmettre les erreurs ou les données de profil dans le pipeline.

Exemple

Voici un exemple en pseudo-JavaScript illustrant comment vous pourriez implémenter la fonction login. Pour des exemples propres à chaque langage, consultez exemple de script par langage.
function verify(email, callback) {
  // Envoyer le courriel à l'API de base de données externe
  let options = {
    url: "https://example.com/api/verify",
    body: {
      email: email
    }
  };

  send(options, (err) => {
    // Retourner une erreur dans le rappel si la mise à jour a échoué
    if (err) {
      return callback(new Error(email, "My custom error message."));
    } else {
      // Retourner true dans le rappel si la mise à jour a réussi
      return callback(null, true);
    }
  });
}

Fonction callback

La fonction callback sert à transmettre les données de profil de l’utilisateur ou les données d’erreur dans le pipeline.

Définition

La fonction callback peut accepter jusqu’à deux paramètres et renvoie une fonction :
callback(error, [verified]): function
ParamètreTypeObligatoireDescription
errorObjectObligatoireContient les données d’erreur.
verifiedBooleanFacultatifContient une valeur qui indique l’état de vérification de l’utilisateur dans la base de données externe (true ou false). Obligatoire uniquement si la valeur est true.

Retourner un succès

Si le statut de vérification de l’utilisateur a été mis à jour avec succès dans la base de données externe, transmettez la valeur null pour le paramètre error et la valeur true pour le paramètre verified.
Le script Verify ne modifie pas la valeur de l’attribut email_verified dans le profil Auth0 de l’utilisateur, quelle que soit la valeur renvoyée dans la fonction callback.Pour mettre à jour l’attribut email_verified dans le profil Auth0 de l’utilisateur, vous devez inclure l’attribut email_verified et sa valeur dans l’objet de profil utilisateur renvoyé dans les scripts Login et Get User.

Exemple

callback(null, true);

Renvoyer une erreur

Si une erreur se produit, le paramètre error doit contenir des renseignements pertinents sur la nature de l’erreur.

Exemple

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

Exemples de scripts par langage

Auth0 fournit des scripts d’exemple pour les langages/technologies suivants :

JavaScript

function verify(email, callback) {
  // Ce script doit marquer l'adresse courriel de l'utilisateur actuel comme vérifiée dans
  // votre base de données.
  // Il est exécuté chaque fois qu'un utilisateur clique sur le lien de vérification envoyé par courriel.
  // Ces courriels peuvent être personnalisés à l'adresse https://manage.auth0.com/#/emails.
  // On peut supposer sans risque que l'adresse courriel de l'utilisateur existe déjà dans votre base de données,
  // car les courriels de vérification, s'ils sont activés, sont envoyés immédiatement après
  // une inscription réussie.
  //
  // Ce script peut se terminer de deux façons :
  // 1. L'adresse courriel de l'utilisateur a été vérifiée avec succès
  //     callback(null, true);
  // 2. Un problème est survenu lors de la tentative d'accès à votre base de données :
  //     callback(new Error("my error message"));
  //
  // Si une erreur est retournée, elle sera transmise à la chaîne de requête de la page
  // vers laquelle l'utilisateur est redirigé après avoir cliqué sur le lien de vérification.
  // Par exemple, retourner `callback(new Error("error"))` et rediriger vers
  // https://example.com redirigera vers l'URL suivante :
  //     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));
}

ASP.NET Membership Provider (MVC3 - fournisseurs universels)

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,
      // Requis pour récupérer l'userId nécessaire à la création de l'entité Membership
      rowCollectionOnRequestCompletion: true
    }
  });
  connection.on('debug', function(text) {
    // en cas de problèmes de connexion, décommentez ceci pour obtenir des informations plus détaillées
    //console.log(text);
  }).on('errorMessage', function(text) {
    // affiche toutes les erreurs lors de la connexion à la base de données SQL ou avec les instructions 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); // retournera un 500
      callback(null, wasUpdated);
    });
  });
  function verifyMembershipUser(email, callback) {
    // le champ isApproved est l'indicateur de vérification du courriel
    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);
  }
}

ASP.NET Membership Provider (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,
      // Requis pour récupérer l'userId nécessaire à la création de l'entité Membership
      rowCollectionOnRequestCompletion: true
    }
  });
  connection.on('debug', function(text) {
    // si vous avez des problèmes de connexion, décommentez ceci pour obtenir des informations plus détaillées
    //console.log(text);
  }).on('errorMessage', function(text) {
    // affiche toutes les erreurs lors de la connexion à la base de données SQL ou avec les instructions 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); // retournera 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);
      // le champ isConfirmed est l'indicateur de vérification du courriel
      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) {
  //cet exemple utilise la bibliothèque "pg"
  //plus d'informations ici : 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) {
      // REMARQUE : appelez toujours `done()` ici pour fermer
      // la connexion à la base de données
      done();
      return callback(err, result && result.rowCount > 0);
    });
  });
}

SQL Server

function verify (email, callback) {
  //cet exemple utilise la bibliothèque "tedious"
  //plus d'informations ici : 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 données SQL de Windows Azure

function verify (email, callback) {
  //cet exemple utilise la bibliothèque "tedious"
  //plus d'informations ici : 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) {
    // Décommenter la ligne suivante pour activer les messages de débogage
    // console.log(text);
  }).on('errorMessage', function(text) {
    console.log(JSON.stringify(text, null, 2));
  }).on('infoMessage', function(text) {
    // Décommenter la ligne suivante pour activer les messages d'information
    // 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);
  });
}

En savoir plus