ExpressJS Autentikasi #4 | Login User Dengan JWT (Json Web Token)

Ahmad Nurul Laiq
3 min readApr 20, 2024

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:

--

--

Ahmad Nurul Laiq

full stack developer an have experience for 2+ years. I am always eager to learn and stay abreast of the latest technology in the world of software development.