Membuat Autentikasi User di Node.js Menggunakan Passport

Postingan kali ini akan dibahas mengenai tutorial membuat autentikasi user untuk proses login di web app yang dibuat menggunakan nodejs, express, dan passport. Ketika user belum login akan diarahkan ke halaman /login untuk memasukkan username dan password yang terdapat di database.

Setelah berhasil login, user akan diarahkan ke halaman /.
Untuk login digunakan data dari tabel users, username mengambil kolom first_name dan password menggunakan data di kolom password.

File database langkap dapat diunduh di sini.

Install node module yang dibutuhkan
npm install express-session mysql passport passport-local --save

Buat halaman untuk login, memuat sebuah form dengan method POST dan action, misalnya ke /login. Pada project ini digunakan templating engine pug. Source code halaman login adalah sebagai berikut (signin.pug)
extends layout

block content  
  main.container.mt-5
    h1= 'Login'
    form(action="/login" method="POST")
      .row.form-group
        label(for="Username") Username 
        input#username(type="text", name="username") 
      .row.form-group
        label(for="Password") Password 
        input#password(type="password", name="password")
input.btn.btn-primary(type="submit" value="Submit")

Pada file main javascript (app.js) tambahkan variabel passport dan LocalStrategy (metode autentikasi passport yang digunakan adalah local, yaitu menggunakan data user yang terdapat di database)
var passport = require('passport');
var LocalStrategy = require('passport-local').Strategy;

Tambahkan variabel untuk koneksi data ke MySQL
var mysql = require('mysql');
var con = mysql.createConnection({
  host: "nama_host",
  user: "username_mysql",
  password: "password_mysql",
  database: "nama_database"
});

Tambahkan code berikut untuk autentikasi user dengan passport
passport.use(new LocalStrategy(
  function(username, password, done) {
    con.query('SELECT * FROM users WHERE first_name = ? and password = ?', 
    [username, password], function(err, rows, fields) {
      if(err) return done(err);
  
      // if user not found
      if (rows.length <= 0) {
        return done('Incorrect username or password.');
      } 
      return done(null, rows[0]);
    });
  }
));

passport.serializeUser(function(user, done) {
  done(null, user.id);
});

passport.deserializeUser(function(id, done) {
  con.query('SELECT * FROM users WHERE id = ?', [id], function(err, user) {
    if(err) return done(err);
    done(null, user);
  });
});

Tambahkan konfigurasi express-session, misalnya sebagai berikut
app.use(require('express-session')(
  { secret: 'keyboard cat', resave: false, saveUninitialized: false })
);

Kemudian tambahkan code untuk inisialiasi passport
app.use(passport.initialize());
app.use(passport.session());

Selanjutnya tambahkan function isAuthenticated yang digunakan untuk membatasi akses user ke route tertentu, apabila user belum login akan diarahkan ke halaman /login
function isAuthenticated(req, res, next) {
  if (req.isAuthenticated())
    return next();
  res.redirect('/login');
}

Contoh penggunaan function isAuthenticated sebagai berikut
app.get('/', isAuthenticated, function(req, res) {
  res.render('index', {title: 'Express'});
});

Ketika user mengakses /, akan diperiksa terlebih dulu apakah user sudah terautentikasi (sudah login). Apabila user sudah login, user akan diarahkan ke /, namun bila user belum login akan diarahkan ke /login.

Isi dari route GET /login adalah render halaman signin yang berisi form untuk login
app.get('/login',
  function(req, res){
    res.render('signin');
  }
);

Sedangkan untuk POST /login yang berisi mekanisme login user, isinya adalah sebagai berikut
app.post('/login', 
  passport.authenticate('local', { 
    successRedirect: '/',
    failureRedirect: '/login' }),
  function(req, res) {
    res.redirect('/');
});

Demikianlah cara membuat mekanisme autentikasi user menggunakan module passport di Node.js, untuk lebih jelasnya dapat mengclone project lengkap dari laman Github.

Apabila terdapat hal yang kurang jelas, silakan menuliskan pertanyaan di kolom komentar. Terima kasih, semoga bermanfaat.

Comments