UI vs. UX: What’s the difference?

Membuat Autentikasi Login dengan Express & MongoDB

Kita akan membangun sistem login dan register (autentikasi) sederhana menggunakan:

  • Node.js + Express (backend)
  • MongoDB (database)
  • Mongoose (untuk koneksi ke MongoDB)
  • bcryptjs (untuk mengamankan password)
  • jsonwebtoken (JWT) (untuk autentikasi berbasis token)

1. Persiapan Awal

Pastikan kamu sudah install:

2. Buat Proyek Baru

Jalankan di terminal:

mkdir login-auth
cd login-auth
npm init -y

Install paket yang dibutuhkan:

npm install express mongoose dotenv bcryptjs jsonwebtoken
npm install --save-dev nodemon

3. Struktur Folder

login-auth/
├── config/
│   └── db.js
├── models/
│   └── User.js
├── routes/
│   └── auth.js
├── .env
├── server.js
├── package.json

4. Setup File .env

Buat file .env di root project dan isi:

PORT=5000
MONGO_URI=mongodb://localhost:27017/login-auth
JWT_SECRET=rahasia_super_amannya

5. Koneksi ke MongoDB

File: config/db.js

const mongoose = require('mongoose');

const connectDB = async () => {
  try {
    await mongoose.connect(process.env.MONGO_URI);
    console.log('MongoDB Connected');
  } catch (err) {
    console.error(err.message);
    process.exit(1);
  }
};

module.exports = connectDB;

6. Setup Server Express

File: server.js

require('dotenv').config();
const express = require('express');
const connectDB = require('./config/db');
const authRoutes = require('./routes/auth');

const app = express();
connectDB();

app.use(express.json()); // Middleware agar bisa parsing JSON
app.use('/api/auth', authRoutes); // Routing

const PORT = process.env.PORT || 5000;
app.listen(PORT, () => console.log(`Server berjalan di port ${PORT}`));

7. Buat Model User

File: models/User.js

const mongoose = require('mongoose');

const UserSchema = new mongoose.Schema({
  name: {
    type: String,
    required: true
  },
  email: {
    type: String,
    required: true,
    unique: true
  },
  password: {
    type: String,
    required: true
  }
});

module.exports = mongoose.model('User', UserSchema);

8. Buat Routing Register & Login

File: routes/auth.js

const express = require('express');
const bcrypt = require('bcryptjs');
const jwt = require('jsonwebtoken');
const User = require('../models/User');
const router = express.Router();

// Route: POST /api/auth/register
router.post('/register', async (req, res) => {
  const { name, email, password } = req.body;
  try {
    // Cek apakah user sudah ada
    let user = await User.findOne({ email });
    if (user) return res.status(400).json({ msg: 'User sudah terdaftar' });

    // Buat user baru
    user = new User({ name, email, password });

    // Hash password
    const salt = await bcrypt.genSalt(10);
    user.password = await bcrypt.hash(password, salt);

    await user.save();

    res.status(201).json({ msg: 'Registrasi berhasil!' });
  } catch (err) {
    console.error(err.message);
    res.status(500).send('Server error');
  }
});

// Route: POST /api/auth/login
router.post('/login', async (req, res) => {
  const { email, password } = req.body;
  try {
    // Cari user
    const user = await User.findOne({ email });
    if (!user) return res.status(400).json({ msg: 'Email tidak ditemukan' });

    // Cek password
    const isMatch = await bcrypt.compare(password, user.password);
    if (!isMatch) return res.status(400).json({ msg: 'Password salah' });

    // Buat token
    const payload = { userId: user.id };
    const token = jwt.sign(payload, process.env.JWT_SECRET, { expiresIn: '1h' });

    res.json({ token });
  } catch (err) {
    console.error(err.message);
    res.status(500).send('Server error');
  }
});

module.exports = router;

9. Coba Jalankan Server

npm run start

Jika berhasil, terminal akan menampilkan:

MongoDB Connected
Server berjalan di port 5000

10. Uji API dengan Postman

Register

  • Method: POST
  • URL: http://localhost:5000/api/auth/register
  • Body (JSON):
{
  "name": "Jane Doe",
  "email": "[email protected]",
  "password": "123456"
}

Login

Method: POST

  • URL: http://localhost:5000/api/auth/login
  • Body (JSON):
{
  "email": "[email protected]",
  "password": "123456"
}

Response sukses:

{
  "token": "eyJhbGciOiJIUzI1NiIsInR..."
}

Token ini bisa digunakan untuk akses endpoint yang memerlukan autentikasi.

11. (Opsional) Middleware Auth untuk Lindungi Route

File: middleware/auth.js

const jwt = require('jsonwebtoken');

module.exports = function (req, res, next) {
  const token = req.header('Authorization');
  if (!token) return res.status(401).json({ msg: 'Token tidak ditemukan' });

  try {
    const decoded = jwt.verify(token.split(" ")[1], process.env.JWT_SECRET);
    req.user = decoded.userId;
    next();
  } catch (err) {
    res.status(401).json({ msg: 'Token tidak valid' });
  }
};

Gunakan middleware ini untuk melindungi route:

const auth = require('../middleware/auth');

router.get('/profile', auth, async (req, res) => {
  const user = await User.findById(req.user).select('-password');
  res.json(user);
});

Penutup

Selamat! 
Kamu sudah berhasil membuat sistem autentikasi sederhana menggunakan:

  • Express.js untuk backend
  • MongoDB + Mongoose untuk penyimpanan data
  • bcryptjs untuk keamanan password
  • JWT untuk token autentikasi