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:
- Node.js
- MongoDB (bisa lokal atau MongoDB Atlas)
- Postman untuk uji API (opsional)
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