Penggunaan JSON Web Token (JWT) di Express.js

A
IQBAL FARHAN SYUHADA
16 Jun 2024

Penggunaan JSON Web Token (JWT) di Express.js

JSON Web Token (JWT) adalah standar terbuka yang memungkinkan pertukaran informasi yang aman antara dua pihak dalam bentuk objek JSON. Informasi ini dapat diverifikasi dan dipercaya karena telah ditandatangani secara digital. JWT sering digunakan dalam otentikasi dan otorisasi pengguna di aplikasi web.

Berikut adalah langkah-langkah penggunaan JWT di aplikasi Express.js:

1. Instalasi Paket yang Diperlukan

Pertama, kita perlu menginstal paket jsonwebtoken dan express jika belum diinstal.

npm install express jsonwebtoken

2. Membuat Server Express

Buat file bernama app.js dan tulis kode dasar untuk server Express.

const express = require('express');
const jwt = require('jsonwebtoken');
const app = express();

app.use(express.json());

const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
    console.log(`Server is running on port ${PORT}`);
});

3. Membuat Rute untuk Login dan Menghasilkan JWT

Tambahkan rute untuk login yang akan menghasilkan token JWT jika kredensial pengguna valid.

const users = [
    { id: 1, username: 'user1', password: 'password1' },
    { id: 2, username: 'user2', password: 'password2' }
];

app.post('/login', (req, res) => {
    const { username, password } = req.body;
    const user = users.find(u => u.username === username && u.password === password);
    
    if (user) {
        const token = jwt.sign({ id: user.id, username: user.username }, 'secretkey', { expiresIn: '1h' });
        res.json({ token });
    } else {
        res.status(400).send('Username or password is incorrect');
    }
});

4. Middleware untuk Verifikasi Token

Buat middleware untuk memverifikasi token JWT yang dikirim oleh klien.

const verifyToken = (req, res, next) => {
    const token = req.headers['authorization'];
    
    if (!token) {
        return res.status(403).send('A token is required for authentication');
    }

    try {
        const decoded = jwt.verify(token, 'secretkey');
        req.user = decoded;
    } catch (err) {
        return res.status(401).send('Invalid Token');
    }
    return next();
};

5. Rute yang Dilindungi

Tambahkan rute yang dilindungi oleh middleware verifikasi token.

app.get('/protected', verifyToken, (req, res) => {
    res.send('This is a protected route');
});

6. Menjalankan Aplikasi

Sekarang, jalankan aplikasi dengan perintah:

node app.js

Kesimpulan

Dengan langkah-langkah di atas, Anda telah berhasil mengintegrasikan JWT ke dalam aplikasi Express.js Anda untuk otentikasi dan otorisasi. JWT membantu memastikan bahwa hanya pengguna yang telah diautentikasi yang dapat mengakses rute yang dilindungi di aplikasi Anda.

Contoh Lengkap app.js

Berikut adalah contoh lengkap dari file app.js:

const express = require('express');
const jwt = require('jsonwebtoken');
const app = express();

app.use(express.json());

const users = [
    { id: 1, username: 'user1', password: 'password1' },
    { id: 2, username: 'user2', password: 'password2' }
];

app.post('/login', (req, res) => {
    const { username, password } = req.body;
    const user = users.find(u => u.username === username && u.password === password);
    
    if (user) {
        const token = jwt.sign({ id: user.id, username: user.username }, 'secretkey', { expiresIn: '1h' });
        res.json({ token });
    } else {
        res.status(400).send('Username or password is incorrect');
    }
});

const verifyToken = (req, res, next) => {
    const token = req.headers['authorization'];
    
    if (!token) {
        return res.status(403).send('A token is required for authentication');
    }

    try {
        const decoded = jwt.verify(token, 'secretkey');
        req.user = decoded;
    } catch (err) {
        return res.status(401).send('Invalid Token');
    }
    return next();
};

app.get('/protected', verifyToken, (req, res) => {
    res.send('This is a protected route');
});

const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
    console.log(`Server is running on port ${PORT}`);
});

Dengan mengikuti tutorial ini, Anda bisa mengamankan rute dalam aplikasi Express.js menggunakan JWT. Kemudian, Untuk menggunakan endpoint /login tersebut dengan React.js dan Axios, Anda bisa mengikuti langkah-langkah berikut ini.

1. Instalasi Axios di Proyek React

Jika Anda belum menginstal Axios di proyek React Anda, Anda bisa melakukannya dengan perintah berikut:

npm install axios

2. Membuat Form Login di React

Buat sebuah komponen login di React, misalnya Login.js.

import React, { useState } from 'react';
import axios from 'axios';

const Login = () => {
    const [username, setUsername] = useState('');
    const [password, setPassword] = useState('');
    const [message, setMessage] = useState('');

    const handleLogin = async (e) => {
        e.preventDefault();
        
        try {
            const response = await axios.post('http://localhost:3000/login', {
                username,
                password
            });
            const { token } = response.data;
            localStorage.setItem('token', token);
            setMessage('Login successful!');
        } catch (error) {
            setMessage('Login failed: ' + error.response.data);
        }
    };

    return (
        <div>
            <h2>Login</h2>
            <form onSubmit={handleLogin}>
                <div>
                    <label>Username</label>
                    <input 
                        type="text" 
                        value={username} 
                        onChange={(e) => setUsername(e.target.value)} 
                    />
                </div>
                <div>
                    <label>Password</label>
                    <input 
                        type="password" 
                        value={password} 
                        onChange={(e) => setPassword(e.target.value)} 
                    />
                </div>
                <button type="submit">Login</button>
            </form>
            {message && <p>{message}</p>}
        </div>
    );
};

export default Login;

3. Menggunakan Token untuk Mengakses Rute yang Dilindungi

Buat sebuah komponen yang akan mengakses rute yang dilindungi menggunakan token yang sudah disimpan di localStorage.

import React, { useEffect, useState } from 'react';
import axios from 'axios';

const Protected = () => {
    const [message, setMessage] = useState('');

    useEffect(() => {
        const fetchData = async () => {
            const token = localStorage.getItem('token');
            try {
                const response = await axios.get('http://localhost:3000/protected', {
                    headers: {
                        'Authorization': token
                    }
                });
                setMessage(response.data);
            } catch (error) {
                setMessage('Failed to fetch protected data: ' + error.response.data);
            }
        };

        fetchData();
    }, []);

    return (
        <div>
            <h2>Protected Route</h2>
            {message && <p>{message}</p>}
        </div>
    );
};

export default Protected;

4. Mengatur Routing di React

Buat routing untuk mengakses komponen Login dan Protected, misalnya menggunakan React Router.

import React from 'react';
import { BrowserRouter as Router, Route, Routes } from 'react-router-dom';
import Login from './Login';
import Protected from './Protected';

function App() {
    return (
        <Router>
            <div>
                <Routes>
                    <Route path="/login" element={<Login />} />
                    <Route path="/protected" element={<Protected />} />
                </Routes>
            </div>
        </Router>
    );
}

export default App;

Penjelasan

  1. Login.js: Komponen ini membuat form login yang mengirimkan permintaan POST ke endpoint /login untuk mendapatkan token. Jika login berhasil, token disimpan di localStorage.
  2. Protected.js: Komponen ini mengakses rute yang dilindungi dengan mengirimkan token yang telah disimpan di localStorage dalam header permintaan.
  3. App.js: Komponen utama yang mengatur routing untuk komponen Login dan Protected menggunakan React Router.

Dengan setup ini, Anda dapat melakukan login dan mengakses rute yang dilindungi di backend Express.js menggunakan React dan Axios.