
Halo teman-teman! ๐
Di artikel sebelumnya, kita udah bikin backend API untuk CRUD data to-do. Tapi saat ini semua orang bisa akses tanpa login ๐ฑ. Jadi, di bagian ini kita bakal bikin sistem autentikasi user pakai JWT (JSON Web Token) di Express.
Buat file baru models/User.js
:
const mongoose = require('mongoose');
const userSchema = new mongoose.Schema({
email: { type: String, required: true, unique: true },
password: { type: String, required: true }
}, { timestamps: true });
module.exports = mongoose.model('User', userSchema);
Install dua package penting untuk enkripsi dan token:
npm install bcryptjs jsonwebtoken
Buat file routes/authRoutes.js
:
const express = require('express');
const bcrypt = require('bcryptjs');
const jwt = require('jsonwebtoken');
const User = require('../models/User');
const router = express.Router();
// Register
router.post('/register', async (req, res) => {
try {
const { email, password } = req.body;
const exist = await User.findOne({ email });
if (exist) return res.status(400).json({ message: 'Email sudah terdaftar' });
const hashed = await bcrypt.hash(password, 10);
const newUser = new User({ email, password: hashed });
await newUser.save();
res.json({ message: 'User berhasil dibuat' });
} catch (err) {
res.status(500).json({ error: err.message });
}
});
// Login
router.post('/login', async (req, res) => {
try {
const { email, password } = req.body;
const user = await User.findOne({ email });
if (!user) return res.status(400).json({ message: 'Email tidak ditemukan' });
const match = await bcrypt.compare(password, user.password);
if (!match) return res.status(400).json({ message: 'Password salah' });
const token = jwt.sign({ userId: user._id }, process.env.JWT_SECRET, { expiresIn: '7d' });
res.json({ token });
} catch (err) {
res.status(500).json({ error: err.message });
}
});
module.exports = router;
Tambahkan route ini di index.js
:
const authRoutes = require('./routes/authRoutes');
app.use('/api/auth', authRoutes);
Buat file middleware/authMiddleware.js
:
const jwt = require('jsonwebtoken');
function authMiddleware(req, res, next) {
const token = req.header('Authorization')?.split(' ')[1];
if (!token) return res.status(401).json({ message: 'Token tidak ada' });
try {
const verified = jwt.verify(token, process.env.JWT_SECRET);
req.user = verified;
next();
} catch (err) {
res.status(401).json({ message: 'Token tidak valid' });
}
}
module.exports = authMiddleware;
Di route to-do, import middleware ini dan gunakan:
const auth = require('../middleware/authMiddleware');
router.get('/', auth, async (req, res) => {
// hanya user yang sudah login bisa akses
});
Kamu bisa tes pakai Postman atau Thunder Client:
POST /api/auth/register
โ body: { “email”: “tes@mail.com”, “password”: “123456” }POST /api/auth/login
โ dapatkan tokenAuthorization: Bearer <token>
saat akses todoJWT_SECRET
di file .env
:JWT_SECRET=rahasia_super_aman
Gunakan string acak dan jangan bagikan token secara sembarangan.
Sekarang kita sudah punya sistem login dan register yang aman! Di artikel selanjutnya, kita akan sambungkan frontend dengan backend supaya user bisa login langsung dari React dan melihat to-do mereka masing-masing.
Sampai ketemu di Bagian 5: Menghubungkan Frontend dan Backend ya! ๐