ExpressJS Autentikasi #4 | Login User Dengan JWT (Json Web Token)
Pengantar
Dalam pengembangan aplikasi web dengan ExpressJS, langkah penting setelah registrasi user adalah menyediakan mekanisme login yang aman. Pada panduan ini, kita akan membuat endpoint login dengan menggunakan JWT (Json Web Token) untuk otentikasi user.
Edit Route Auth
Edit file routes/auth.js
untuk menambahkan route login:
const express = require('express');
const router = express.Router();
const { registerUser, loginUser } = require('../controllers/authController');
router.post('/register', registerUser);
router.post('/login', loginUser);
module.exports = router;
- Dengan menambahkan route
/login
, kita bisa menangani proses login user.
Edit Model User
Edit file models/user.js
untuk menyesuaikan model User dengan fitur hashing password dan method untuk memeriksa kecocokan password:
'use strict';
const { Model } = require('sequelize');
const bcrypt = require('bcrypt');
const jwt = require('jsonwebtoken');
module.exports = (sequelize, DataTypes) => {
class User extends Model {
static associate(models) {
// define association here
}
}
User.init({
id: {
type: DataTypes.UUID,
defaultValue: DataTypes.UUIDV4,
primaryKey: true,
},
name: {
type: DataTypes.STRING,
allowNull: false,
unique: true,
},
email: {
type: DataTypes.STRING,
allowNull: false,
unique: true,
},
password: {
type: DataTypes.STRING,
allowNull: false,
},
role_id: {
type: DataTypes.UUID,
},
}, {
hooks: {
beforeCreate: async (user) => {
if (user.password) {
const salt = await bcrypt.genSaltSync(10);
user.password = bcrypt.hashSync(user.password, salt);
}
if (!user.role_id) {
const roleUser = await sequelize.models.Role.findOne({ where: { name: 'user' } });
user.role_id = roleUser.id;
}
},
},
sequelize,
modelName: 'User',
});
// Method to check if provided password matches the stored hashed password
User.prototype.CorrectPassword = async (reqPassword, passwordDb) => {
return await bcrypt.compareSync(reqPassword, passwordDb);
}
return User;
};
- Model ini telah ditambahkan dengan method
CorrectPassword
untuk memeriksa kecocokan password saat login.
Install Jsonwebtoken dan Atur Environment Variables
Install jsonwebtoken dan atur JWT Secret serta JWT Expires dalam file .env
:
DB_DATABASE=learning-expressjs
DB_HOST=127.0.0.1
DB_USERNAME=root
DB_PASSWORD=""
DB_CONNECTION=mysql
PORT=3000
JWT_SECRET=dyauiyduag-djabdajd-ambdhabdah-jdajdhauh-dhajdha
JWT_EXPIRES_IN=1d
- Pastikan juga untuk melakukan instalasi package jsonwebtoken dengan perintah
npm i jsonwebtoken
.
Edit Auth Controller
Edit file controllers/authController.js
seperti berikut:
const { User } = require('../models');
const jwt = require('jsonwebtoken');
const signToken = (id) => {
return jwt.sign({ id }, process.env.JWT_SECRET, { expiresIn: process.env.JWT_EXPIRES_IN });
};
exports.registerUser = async (req, res) => {
try {
if (req.body.password !== req.body.passwordConfirm) {
return res.status(400).json({ message: "Password dan Password Confirm tidak sama" });
}
const newUser = await User.create({
name: req.body.name,
email: req.body.email,
password: req.body.password,
});
const token = signToken(newUser.id);
res.status(201).json({
message: "Berhasil Register",
data: newUser,
token,
});
} catch (error) {
console.error(error);
res.status(400).json({ message: "Gagal Register" });
}
};
exports.loginUser = async (req, res) => {
if (!req.body.email || !req.body.password) {
return res.status(400).json({ status: "Fail", message: "Error: Mohon berikan email dan password" });
}
try {
const userData = await User.findOne({ where: { email: req.body.email } });
if (!userData || !(await userData.CorrectPassword(req.body.password, userData.password))) {
return res.status(401).json({ status: "Fail", message: "Error: Email atau password salah" });
}
const token = signToken(userData.id);
return res.status(200).json({ status: "Success", message: "Login berhasil", token });
} catch (error) {
console.error("Error saat login:", error);
return res.status(500).json({ status: "Fail", message: "Server error saat login", error: error.message });
}
};
- Pada controller ini, kita menggunakan
CorrectPassword
method dari model User untuk memverifikasi password saat login. - Fungsi
signToken
digunakan untuk menandatangani token JWT dengan secret yang sudah ditentukan.
Kesimpulan
Dalam panduan ini, kita telah membuat endpoint untuk registrasi dan login user dengan menggunakan JWT (Json Web Token) untuk otentikasi. Proses registrasi akan meng-hash password sebelum disimpan ke database, sementara proses login akan memeriksa kecocokan password yang diinputkan dengan password yang ada di database. Dengan ini, aplikasi ExpressJS telah memiliki sistem autentikasi yang lebih aman.
Untuk melihat contoh kode yang lengkap, Anda dapat mengunjungi repositori GitHub saya di sini.
Referensi: