Aplikasi To-do List dengan Fitur Login (Fullstack Web App)

Ilustrasi Gambar: Aplikasi To-do List.

Bagian 4: Autentikasi User dengan JWT

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.

๐Ÿงฑ Langkah 1: Buat Model User

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);
  

๐Ÿ” Langkah 2: Setup Route Auth

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);
  

๐Ÿ›ก๏ธ Langkah 3: Middleware Proteksi JWT

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
});
  

๐Ÿงช Langkah 4: Tes API Auth

Kamu bisa tes pakai Postman atau Thunder Client:

  • POST /api/auth/register โ€” body: { “email”: “tes@mail.com”, “password”: “123456” }
  • POST /api/auth/login โ€” dapatkan token
  • Gunakan token di header: Authorization: Bearer <token> saat akses todo

โš ๏ธ Catatan

  • Jangan lupa buat JWT_SECRET di file .env:
JWT_SECRET=rahasia_super_aman

Gunakan string acak dan jangan bagikan token secara sembarangan.

โœ… Kesimpulan

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! ๐Ÿ”

Pages: 1 2 3 4 5 6

Leave a Reply

Your email address will not be published. Required fields are marked *

You might also like