Menangani Autentikasi dan Otorisasi di Backend dengan Express.js
Autentikasi dan otorisasi adalah dua konsep penting dalam pengembangan aplikasi backend. Autentikasi memastikan bahwa pengguna yang mengakses aplikasi adalah siapa yang mereka klaim, sementara otorisasi menentukan hak akses mereka dalam aplikasi. Dalam artikel ini, kita akan belajar bagaimana cara menangani autentikasi dan otorisasi menggunakan Express.js, Passport.js, dan JWT (JSON Web Token).
Instalasi dan Persiapan
Untuk implementasi autentikasi dan otorisasi, kita akan menggunakan dua library utama:
- Passport.js - Middleware untuk autentikasi pengguna.
- jsonwebtoken (JWT) - Untuk membuat token yang digunakan untuk autentikasi pengguna di berbagai request.
Langkah pertama adalah menginstal dependensi yang diperlukan:
$ npm install passport passport-local jsonwebtoken bcryptjs express-session
Mengatur Passport.js untuk Autentikasi
Passport.js adalah middleware yang mendukung berbagai strategi autentikasi. Di sini, kita akan menggunakan strategi lokal untuk mengautentikasi pengguna berdasarkan username dan password. Berikut adalah cara mengatur Passport.js:
const passport = require('passport');
const LocalStrategy = require('passport-local').Strategy;
const bcrypt = require('bcryptjs');
// Definisikan bagaimana Passport akan menangani autentikasi
passport.use(new LocalStrategy((username, password, done) => {
User.findOne({ username: username }, (err, user) => {
if (err) return done(err);
if (!user) return done(null, false, { message: 'Incorrect username' });
bcrypt.compare(password, user.password, (err, res) => {
if (err) return done(err);
if (res) return done(null, user); // Autentikasi berhasil
else return done(null, false, { message: 'Incorrect password' });
});
});
}));
Menyimpan Pengguna di Session
Passport.js menyarankan untuk menyimpan data pengguna dalam session setelah autentikasi berhasil. Berikut cara melakukannya:
passport.serializeUser((user, done) => {
done(null, user.id); // Simpan ID pengguna di session
});
passport.deserializeUser((id, done) => {
User.findById(id, (err, user) => {
done(err, user); // Dapatkan data pengguna dari ID yang disimpan di session
});
});
Menambahkan Middleware untuk Autentikasi
Setelah Passport.js diatur, kita perlu menambahkan middleware yang akan digunakan untuk melindungi route yang memerlukan autentikasi. Berikut adalah contoh middleware untuk memastikan bahwa pengguna sudah terautentikasi:
function isAuthenticated(req, res, next) {
if (req.isAuthenticated()) {
return next();
}
res.redirect('/login');
}
// Menggunakan middleware di route yang dilindungi
app.get('/dashboard', isAuthenticated, (req, res) => {
res.send('Selamat datang di dashboard!');
});
Membuat dan Memverifikasi JWT
JWT digunakan untuk mengautentikasi pengguna tanpa perlu menyimpan session di server. Kita akan mengirim token JWT ke pengguna setelah login, dan pengguna akan menyertakan token ini di setiap request berikutnya. Berikut adalah cara membuat dan memverifikasi JWT:
const jwt = require('jsonwebtoken');
// Membuat JWT setelah login berhasil
function generateToken(user) {
return jwt.sign({ id: user.id, username: user.username }, 'secretkey', { expiresIn: '1h' });
}
// Memverifikasi JWT
function verifyToken(req, res, next) {
const token = req.headers['authorization'];
if (!token) return res.status(403).send('Token is required');
jwt.verify(token, 'secretkey', (err, decoded) => {
if (err) return res.status(403).send('Invalid token');
req.user = decoded; // Menyimpan data pengguna dalam request
next();
});
}
Implementasi Route Login dan Register
Berikut adalah implementasi route untuk login dan register. Pada route login, jika autentikasi berhasil, kita akan mengirimkan token JWT kepada pengguna:
app.post('/login', passport.authenticate('local', { session: false }), (req, res) => {
const token = generateToken(req.user);
res.json({ token: token });
});
app.post('/register', (req, res) => {
const { username, password } = req.body;
bcrypt.hash(password, 10, (err, hashedPassword) => {
const newUser = new User({ username, password: hashedPassword });
newUser.save()
.then(user => res.status(201).send('User created'))
.catch(err => res.status(400).send('Error creating user'));
});
});
Kesimpulan
Dengan menggunakan Passport.js dan JWT, kita dapat mengimplementasikan sistem autentikasi dan otorisasi yang aman dan fleksibel di aplikasi Express.js. Passport.js menyediakan berbagai strategi autentikasi, sementara JWT memungkinkan autentikasi stateless yang cocok untuk aplikasi modern. Jangan lupa untuk selalu melindungi route penting dengan middleware autentikasi dan mengelola session atau token dengan bijak.