Email Verifikasi Dengan Token, Menggunakan Nodemailer.

Pada aplikasi yang dibuat dengan Node.js, kita dapat mengirim email yang berisi link untuk memverifikasi status email dari user yang baru mendaftar. Pertama, Install modul nodemailer dan async:

npm install nodemailer async --save  

Pada script route untuk pendaftaran user, require modul:

var nodemailer    = require('nodemailer');  
var async    = require('async');  
var crypto    = require('crypto');  

Crypto berfungsi untuk menciptakan angka acak yang akan digunakan sebagai token. Selanjutnya dalam route yang berfungsi untuk membuat user tadi gunakan fungsi async:

router.post('/daftar-user', function(req, res){  
//fungsi untuk pendaftaran user dan input data ke database di sini

//berikut fungsi untuk mengirim email verifikasi user menggunakan nodemailer dan async
async.waterfall([  
 function(done) {
  //membuat token
  crypto.randomBytes(20, function(err, buf) {
   var token = buf.toString('hex');
   done(err, token);
   })
 },
 //memasukkan nilai token ke dalam user document
 function(token, done) {
  User.findOne({idUser: req.user.idUser}, function(err, user){
   user.emailVerificationToken = token;
   user.save(function(err) {
    done(err, token, user)
   });
  });
 },
 //kirim email konfirmasi ke user
 function(token, user, done) {
  var smtpTransport = nodemailer.createTransport({
   service: 'Gmail',
   auth: {
   user: 'alamat.email@gmail.com',
   pass: 'password'
   }
  });
  var mailOptions = {
   to: req.user.email,
   from: 'no-reply@gmail.com',
   subject: 'Email Verification',
   html: '<p>Hai ' + user.email + ','+
         'terimakasih telah membuat akun di aplikasi kami.</br>'+
         'Silahkan verifikasi email dengan mengklik link berikut:</br> ' +
         '<a href=http://' + req.headers.host + '/verifikasi-email/' + token +'>Konfirmasi</a>'
  };
  smtpTransport.sendMail(mailOptions, function(err) {
   req.flash('SaveSuccess', 'Email Verifikasi telah dikirim ke ' + req.user.email);
  });
 }
], function(err){
 if(err)
  return next(err);
});

Dengan menggunakan fungsi async.waterfall maka nilai dari parameter user dan token dapat diteruskan sampai ke pengiriman email yaitu fungsi sendMail. pada script diatas yang berfungsi untuk membuat angka token adalah:

function(done) {  
  crypto.randomBytes(20, function(err, buf) {
   var token = buf.toString('hex');
   done(err, token);
   })
 }

angka yang dihasilkan dilanjutkan ke fungsi selanjutnya dalam bentuk parameter bernama token. Lalu, token tersebut dimasukkan ke dalam document user ke dalam field emailverificationToken menggunakan fungsi:

function(token, done) {  
  User.findOne({idUser: req.user.idUser}, function(err, user){
   user.emailVerificationToken = token;
   user.save(function(err) {
    done(err, token, user)
   });
  });
 }

Sekarang field emailVerificationToken pada user berisi nilai token yang akan dijadikan sebagai nilai pembanding ketika user tersebut mengkonfirmasi email. Jika token pada konfirmasi email tepat maka user tersebut akan terverifikasi.
Selanjutnya buat router untuk verifikasi ketika user mengklik konfirmasi pada email yang telah dikirim:

router.get('/verifikasi-email/:token', function(req, res){

    User.findOneAndUpdate(
        {emailVerificationToken: req.params.token},
        {$set: {
            emailConfirmed : 'yes'
        }, $unset: {
            emailVerificationToken: ''
        }},
        {
            save: true,
            upsert: false
        },
        function(err, user){
            if (err)
                res.send(err);
            if (user.role == 'guru') {
                req.flash('SaveSuccess', 'Terima Kasih, Email Anda Sudah diverifikasi');
                res.redirect('/guru');
            }
            else if (data.role == 'unverified') {
                res.redirect('/verified-data');
            }
        }
    );

});

Pada script diatas $set berfungsi untuk mengubah isi dari field emailConfirmed pada document user, sedangkan $unset berfungsi untuk menghilangkan field emailConfirmed pada user karena sudah tidak diperlukan lagi. Sekian untuk tutorial email verifikasi, untuk source code dari artikel ini dapat dilihat disini:
https://github.com/muhano/token-email/tree/master

Geri Muhano

Web programmer di erabelajar.com. Alumni UIN Jakarta.