Xác thực sử dụng JWT với NodeJS

Giới thiệu
JWT (JSON Web Token) là một tiêu chuẩn mở cho việc trao đổi thông tin an toàn giữa các bên. Nó thường được sử dụng để xác thực người dùng và trao đổi dữ liệu an toàn giữa các ứng dụng web. Trong bài viết này, chúng ta sẽ khám phá cách sử dụng JWT để thực hiện xác thực trong ứng dụng Node.js.
JWT là gì?
JWT là một chuỗi ký tự được mã hóa bao gồm ba phần được phân tách bằng dấu chấm (.).
- Header: Nêu loại token và thuật toán mã hóa được sử dụng.
- Payload: Chứa dữ liệu yêu cầu, chẳng hạn như ID người dùng, vai trò, thời gian hết hạn.
- Signature: Được tạo ra bằng cách sử dụng thuật toán mã hóa và khóa bí mật để xác minh tính toàn vẹn của token.
Cách hoạt động
- Đăng ký: Khi người dùng đăng ký, máy chủ tạo một JWT mới với thông tin người dùng và gửi nó cho người dùng.
- Xác thực: Người dùng gửi JWT với mỗi yêu cầu đến máy chủ.
- Kiểm tra: Máy chủ xác minh chữ ký JWT và trích xuất thông tin từ phần tải.
- Xử lý: Máy chủ sử dụng thông tin trích xuất để xác thực người dùng và xử lý yêu cầu.
Các bước thực hiện
- Cài đặt các gói cần thiết:
npm install jsonwebtoken express
- Tạo một ứng dụng Node.js cơ bản:
const express = require('express');
const jwt = require('jsonwebtoken');
const app = express();
const port = 3000;
app.listen(port, () => {
console.log(`Server is running on port ${port}`);
});
- Tạo đường dẫn cho đăng ký:
app.post('/register', (req, res) => {
const { username, password } = req.body;
// ...kiểm tra dữ liệu đầu vào...
const token = jwt.sign({ username: username }, 'your-secret-key', { expiresIn: '1h' });
res.json({ token: token });
});
- Tạo đường dẫn cho xác thực:
app.post('/login', (req, res) => {
const { username, password } = req.body;
// ...kiểm tra thông tin đăng nhập...
const token = jwt.sign({ username: username }, 'your-secret-key', { expiresIn: '1h' });
res.json({ token: token });
});
- Bảo vệ đường dẫn:
function authenticateToken(req, res, next) {
const authHeader = req.headers['authorization'];
const token = authHeader && authHeader.split(' ')[1];
if (token == null) return res.sendStatus(401);
jwt.verify(token, 'your-secret-key', (err, user) => {
if (err) return res.sendStatus(403);
req.user = user;
next();
});
}
app.get('/protected', authenticateToken, (req, res) => {
res.json({ message: 'Dành cho người dùng được xác thực.', user: req.user });
});
❗ Lưu ý:
> Khóa bí mật: Sử dụng một khóa bí mật mạnh để bảo mật token.
> Thời gian hết hạn: Thiết lập thời gian hết hạn ngắn cho token để tăng cường bảo mật.
> Lưu trữ token: Lưu trữ token ở nơi an toàn và không bao giờ chia sẻ nó với người khác.
Kết luận
JWT là một cách đơn giản và hiệu quả để thực hiện xác thực trong ứng dụng Node.js. Bằng cách sử dụng JWT, bạn có thể tạo ra các ứng dụng web an toàn và bảo mật.