
Cara Membuat API CRUD di Express.js dengan MySQL dan Authentication
Ingin membuat API CRUD yang aman dan bisa digunakan di aplikasi nyata? Dalam tutorial ini, kita akan belajar membuat API CRUD menggunakan Express.js, MySQL, dan authentication berbasis JWT (JSON Web Token). Tutorial ini cocok untuk pemula dan dilengkapi dengan langkah-langkah detail yang mudah diikuti.
Yuk, langsung kita mulai! 🚀
Kenapa Harus Menggunakan Authentication?
Authentication penting untuk membatasi akses ke API hanya untuk pengguna yang memiliki izin. Dengan menambahkan authentication berbasis JWT, kita bisa memastikan bahwa:
- Keamanan Data: Hanya pengguna yang terverifikasi yang bisa mengakses atau mengubah data.
- Skalabilitas: Token JWT cocok untuk aplikasi modern berbasis REST API.
- Kemudahan Implementasi: JWT adalah standar yang banyak digunakan dan mudah diintegrasikan.
Tools yang Dibutuhkan
Pastikan kamu sudah menginstal:
- Node.js: Untuk menjalankan Express.js.
- MySQL Server: Untuk menyimpan data.
- Postman: Untuk mengetes API.
- npm: Untuk mengelola dependencies proyek.
Langkah-Langkah Membuat API CRUD di Express.js dengan MySQL dan Authentication
1. Inisialisasi Proyek
Buka terminal dan buat folder proyek baru:
mkdir api-crud-express-mysql-auth
cd api-crud-express-mysql-auth
npm init -y
Ini akan membuat file package.json
untuk proyek kamu.
2. Instal Dependencies
Instal beberapa dependencies berikut:
npm install express mysql2 body-parser cors jsonwebtoken bcryptjs
- express: Framework untuk membuat server.
- mysql2: Library untuk menghubungkan Express.js dengan MySQL.
- body-parser: Untuk parsing request body.
- cors: Agar API bisa diakses dari domain lain.
- jsonwebtoken: Untuk membuat dan memverifikasi token JWT.
- bcryptjs: Untuk mengenkripsi password.
3. Siapkan Database MySQL
Buat database dan tabel di MySQL:
CREATE DATABASE express_crud_auth;
USE express_crud_auth;
-- Tabel untuk data pengguna
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL,
email VARCHAR(255) UNIQUE NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- Tabel untuk autentikasi
CREATE TABLE auth_users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(255) UNIQUE NOT NULL,
password VARCHAR(255) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
4. Struktur Folder Proyek
Buat struktur folder seperti ini:
api-crud-express-mysql-auth/
├── node_modules/
├── package.json
├── server.js
├── config/
│ └── db.js
├── middlewares/
│ └── authMiddleware.js
├── routes/
│ ├── authRoutes.js
│ └── userRoutes.js
5. Konfigurasi Database
Buat file config/db.js
untuk mengatur koneksi MySQL:
const mysql = require('mysql2');
const db = mysql.createConnection({
host: 'localhost',
user: 'root',
password: '', // Ganti dengan password MySQL kamu
database: 'express_crud_auth',
});
db.connect((err) => {
if (err) {
console.error('Koneksi ke database gagal:', err.message);
} else {
console.log('Koneksi ke database berhasil!');
}
});
module.exports = db;
6. Tambahkan Authentication
Buat file routes/authRoutes.js
untuk menangani registrasi dan login:
const express = require('express');
const bcrypt = require('bcryptjs');
const jwt = require('jsonwebtoken');
const db = require('../config/db');
const router = express.Router();
const SECRET_KEY = 'your_secret_key'; // Ganti dengan key rahasia
// Registrasi
router.post('/register', async (req, res) => {
const { username, password } = req.body;
try {
const hashedPassword = await bcrypt.hash(password, 10);
const query = 'INSERT INTO auth_users (username, password) VALUES (?, ?)';
db.query(query, [username, hashedPassword], (err, result) => {
if (err) {
if (err.code === 'ER_DUP_ENTRY') {
return res.status(400).json({ message: 'Username sudah digunakan' });
}
return res.status(500).json(err);
}
res.status(201).json({ message: 'Registrasi berhasil!' });
});
} catch (err) {
res.status(500).json(err);
}
});
// Login
router.post('/login', (req, res) => {
const { username, password } = req.body;
const query = 'SELECT * FROM auth_users WHERE username = ?';
db.query(query, [username], async (err, results) => {
if (err) return res.status(500).json(err);
if (results.length === 0) {
return res.status(401).json({ message: 'Username atau password salah' });
}
const user = results[0];
const isPasswordValid = await bcrypt.compare(password, user.password);
if (!isPasswordValid) {
return res.status(401).json({ message: 'Username atau password salah' });
}
const token = jwt.sign({ id: user.id, username: user.username }, SECRET_KEY, { expiresIn: '1h' });
res.json({ message: 'Login berhasil', token });
});
});
module.exports = router;
7. Middleware Authentication
Buat file middlewares/authMiddleware.js
untuk memverifikasi token JWT:
const jwt = require('jsonwebtoken');
const SECRET_KEY = 'your_secret_key';
const authenticateToken = (req, res, next) => {
const authHeader = req.headers['authorization'];
const token = authHeader && authHeader.split(' ')[1];
if (!token) {
return res.status(401).json({ message: 'Token tidak ada, akses ditolak' });
}
jwt.verify(token, SECRET_KEY, (err, user) => {
if (err) {
return res.status(403).json({ message: 'Token tidak valid' });
}
req.user = user;
next();
});
};
module.exports = authenticateToken;
8. Endpoint CRUD dengan Proteksi Authentication
Modifikasi file routes/userRoutes.js
:
const express = require('express');
const db = require('../config/db');
const authenticateToken = require('../middlewares/authMiddleware');
const router = express.Router();
router.post('/', authenticateToken, (req, res) => {
const { name, email } = req.body;
const query = 'INSERT INTO users (name, email) VALUES (?, ?)';
db.query(query, [name, email], (err, result) => {
if (err) return res.status(500).json(err);
res.status(201).json({ id: result.insertId, name, email });
});
});
router.get('/', authenticateToken, (req, res) => {
const query = 'SELECT * FROM users';
db.query(query, (err, results) => {
if (err) return res.status(500).json(err);
res.json(results);
});
});
// Endpoint lainnya...
9. Tambahkan Routes di server.js
Gabungkan semua routes di file server.js
:
const express = require('express');
const bodyParser = require('body-parser');
const cors = require('cors');
const userRoutes = require('./routes/userRoutes');
const authRoutes = require('./routes/authRoutes');
const app = express();
app.use(cors());
app.use(bodyParser.json());
app.use('/api/auth', authRoutes);
app.use('/api/users', userRoutes);
const PORT = 5000;
app.listen(PORT, () => {
console.log(`Server berjalan di http://localhost:${PORT}`);
});
Testing API
- Registrasi:
POST /api/auth/register
- Login:
POST /api/auth/login
- CRUD Endpoint (dengan token): Tambahkan header
Authorization: Bearer <token>
.
Penutup
API CRUD dengan Express.js, MySQL, dan authentication berbasis JWT ini cocok untuk aplikasi nyata. Pastikan kamu menyimpan kunci rahasia di file .env
untuk keamanan lebih. Kalau ada pertanyaan, jangan ragu untuk bertanya di komentar! 😊
Leave a Reply