Trong thời đại của RESTful APIs và microservices, bảo mật các điểm cuối của bạn là vô cùng quan trọng. Một phương pháp phổ biến và hiệu quả để đảm bảo chỉ những người dùng được ủy quyền mới có thể truy cập vào các tài nguyên cụ thể là thông qua xác thực Bearer Token. Trong blog này, chúng ta sẽ khám phá cách triển khai Bearer Token xác thực trong một ứng dụng Node.js sử dụng Express. Chúng tôi sẽ đề cập đến các kiến thức cơ bản về Bearer Tokens, cách thiết lập chúng trong ứng dụng của bạn, và những thực tiễn tốt nhất để đảm bảo một kiến trúc bảo mật vững mạnh.
Xác Thực Bearer Token là gì?
Xác thực Bearer Token liên quan đến việc cấp một mã thông báo khi xác thực người dùng, mà client phải bao gồm trong tiêu đề Authorization của các yêu cầu tiếp theo. Mã thông báo này hoạt động như một "người mang" thông tin xác thực, có nghĩa là bất kỳ ai sở hữu mã thông báo có thể truy cập vào các tài nguyên liên quan. JSON Web Tokens (JWT) là một dạng Bearer Tokens thường được sử dụng do tính chất không trạng thái và tính linh hoạt của chúng.
Bước 1: Thiết Lập Ứng Dụng Node.js và Express của Bạn
Trước khi chúng ta đi vào việc triển khai Bearer Token, hãy thiết lập một ứng dụng Node.js và Express cơ bản. Chúng ta sẽ bắt đầu bằng cách khởi tạo một dự án mới và cài đặt các phụ thuộc cần thiết.
1. Khởi Tạo Một Dự Án Mới:
mkdir express-bearer-token && cd express-bearer-token
npm init -y
2. Cài Đặt Các Gói Cần Thiết:
npm install express body-parser jsonwebtoken
express
: Framework web cho Node.js.jsonwebtoken
: Thư viện để ký, xác minh và giải mã JWTs.body-parser
: Middleware để phân tích các thân yêu cầu đến.
3. Thiết Lập Máy Chủ Cơ Bản:
Tạo một tệp index.js
và thiết lập một máy chủ Express:
const express = require('express');
const bodyParser = require('body-parser');
const jwt = require('jsonwebtoken');
const app = express();
const PORT = 3000;
const SECRET_KEY = 'your_secret_key';
app.use(bodyParser.json());
app.get('/', (req, res) => {
res.send('Chào mừng bạn đến với Hướng Dẫn Xác Thực Bearer Token!');
});
app.listen(PORT, () => {
console.log(`Máy chủ đang chạy trên http://localhost:${PORT}`);
});
Bước 2: Tạo Một JWT
Trước hết, bạn cần tạo một điểm cuối cho đăng nhập người dùng để tạo và gửi lại một mã thông báo JWT. Để đơn giản, chúng ta sẽ sử dụng một người dùng giả định.
1. Thêm Một Tuyến Đăng Nhập:
const users = {
user1: { username: 'user1', password: 'password1' } // Người dùng giả
};
app.post('/login', (req, res) => {
const { username, password } = req.body;
const user = users[username];
if (user && user.password === password) {
const token = jwt.sign({ username }, SECRET_KEY, { expiresIn: '1h' });
res.json({ token });
} else {
res.status(401).send('Thông tin xác thực không hợp lệ');
}
});
Bước 3: Bảo Vệ Các Tuyến Bằng Bearer Token
Để bảo vệ một số tuyến nhất định, bạn sẽ cần middleware xác minh Bearer Token từ các yêu cầu đến.
1. Tạo Middleware Xác Thực:
Tạo một hàm middleware để xác minh mã thông báo Bearer. Middleware này sẽ kiểm tra tiêu đề Authorization
trong các yêu cầu đến và xác minh mã thông báo bằng một khóa bí mật.
const authenticateToken = (req, res, next) => {
const authHeader = req.headers['authorization'];
const token = authHeader && authHeader.split(' ')[1]; // Bearer <token>
if (token == null) return res.sendStatus(401); // Không có mã thông báo
jwt.verify(token, SECRET_KEY, (err, user) => {
if (err) return res.sendStatus(403); // Mã thông báo không hợp lệ
req.user = user;
next();
});
};
2. Tạo Các Tuyến:
Tạo các tuyến cho đăng nhập và một tuyến bảo vệ yêu cầu xác thực.
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) {
return res.status(400).send('Tên người dùng hoặc mật khẩu không đúng');
}
const token = jwt.sign({ username: user.username }, 'your_jwt_secret_key', { expiresIn: '1h' });
res.json({ token });
});
app.get('/protected', authenticateToken, (req, res) => {
res.send('Đây là một tuyến bảo vệ');
});
Bước 4: Kiểm Tra Việc Triển Khai
Chạy máy chủ của bạn:
node app.js
Để kiểm tra việc triển khai:
- Đăng Nhập: Gửi một yêu cầu POST đến
/login
với một thân JSON chứa thông tinusername
vàpassword
hợp lệ. Nếu thông tin xác thực đúng, bạn sẽ nhận được một JWT. - Truy Cập Tuyến Bảo Vệ: Gửi một yêu cầu GET đến
/protected
với tiêu đềAuthorization
được đặt thànhBearer <your_token>
. Nếu mã thông báo hợp lệ, bạn sẽ có thể truy cập vào tuyến bảo vệ.
Kiểm Tra Xác Thực Bearer Token API với Apidog
Xác thực mã thông báo Bearer là một phương pháp phổ biến được sử dụng trong các ứng dụng web để bảo vệ các yêu cầu API. Apidog, một công cụ API đa năng, đơn giản hóa quy trình này, cho phép các nhà phát triển xác thực các yêu cầu API một cách dễ dàng. Đây là hướng dẫn từng bước về cách bạn có thể kiểm tra xác thực mã thông báo Bearer API bằng Apidog.
Bước 1: Thiết Lập Apidog
- Tải Xuống và Cài Đặt Apidog: Tải Apidog và làm theo hướng dẫn cài đặt cho hệ điều hành của bạn.
- Tạo Một Dự Án Mới: Mở Apidog và tạo một dự án mới nơi bạn có thể quản lý các yêu cầu và thử nghiệm API của mình.
Bước 2: Thêm Một Mã Thông Báo Bearer vào Yêu Cầu API
1. Chọn Xác Thực Bearer Token: Tại bảng điều khiển dự án, tạo một yêu cầu API mới. Điều hướng đến "Auth", và chọn "Bearer Token" từ danh sách thả xuống.
2. Nhập Giá Trị Mã Thông Báo: Nhập trực tiếp giá trị mã thông báo của bạn. Apidog tự động thêm tiền tố "Bearer" cho yêu cầu thực tế.
3. Gửi Yêu Cầu: Khi đã thiết lập mã thông báo Bearer, gửi yêu cầu. Apidog sẽ bao gồm mã thông báo trong tiêu đề xác thực, cho phép bạn truy cập các tài nguyên bảo vệ.
Bước 3: Xác Minh Phản Hồi
Sau khi gửi yêu cầu, kiểm tra phản hồi để đảm bảo rằng cuộc gọi API thành công. Trạng thái 200 OK thường cho thấy xác thực thành công.

Tại Sao Chọn Mã Thông Báo Bearer cho Xác Thực API?
Xác thực mã thông báo Bearer được chọn rộng rãi cho xác thực API do một số lợi thế:
- Không Trạng Thái: Mã thông báo Bearer cho phép máy chủ xác thực các yêu cầu mà không cần duy trì trạng thái phiên, điều này làm cho việc mở rộng ứng dụng dễ dàng hơn.
- Sự Đơn Giản: Mã thông báo dễ để triển khai và sử dụng, thường được bao gồm trong tiêu đề Authorization HTTP.
- Bảo Mật: Mã thông báo có thể được mã hóa và có thời gian hết hạn, tăng cường bảo mật.
- Khả Năng Tương Tác: Mã thông báo Bearer được chuẩn hóa và có thể được sử dụng trên nhiều nền tảng và dịch vụ khác nhau, thúc đẩy khả năng tương tác.
Những lợi ích này khiến mã thông báo Bearer trở thành một lựa chọn mạnh mẽ và linh hoạt cho việc bảo vệ API.
Thực Tiễn Tốt Nhất cho Bảo Mật Mã Thông Báo Bearer
1. Sử Dụng Các Khóa Bí Mật Mạnh:
Đảm bảo rằng khóa bí mật bạn sử dụng để ký JWT là phức tạp và được lưu trữ một cách an toàn. Tránh việc mã hóa nó trong mã nguồn của bạn—hãy xem xét việc sử dụng các biến môi trường.
2. Thời Gian Hết Hạn Mã Thông Báo:
Luôn đặt thời gian hết hạn cho các mã thông báo để giảm thiểu rủi ro bị lạm dụng nếu chúng bị đánh cắp. Thường xuyên quay vòng và vô hiệu hóa các mã thông báo.
3. HTTPS:
Sử dụng HTTPS để bảo vệ dữ liệu trong quá trình truyền tải, bao gồm cả mã thông báo Bearer, đảm bảo mã hóa giữa client và server.
4. Lưu Trữ An Toàn:
Ở phía client, lưu trữ mã thông báo một cách an toàn. Cookies chỉ HTTP và An toàn thường là lựa chọn tốt nhất hơn so với lưu trữ cục bộ hoặc lưu trữ phiên.
5. Giới Hạn Tốc Độ và Giám Sát:
Triển khai giới hạn tốc độ để ngăn chặn các cuộc tấn công brute force. Thêm vào đó, giám sát các API của bạn để phát hiện bất kỳ nỗ lực truy cập trái phép nào.
6. Đưa Mã Thông Báo Bị Xâm Nhập vào Danh Sách Đen:
Duy trì một cơ chế để vô hiệu hóa mã thông báo, chẳng hạn như một danh sách đen, nếu cần thiết phải thu hồi quyền truy cập ngay lập tức.
Kết Luận
Xác thực Bearer Token sử dụng JWT trong một ứng dụng Node.js và Express cung cấp một cách tiếp cận vững mạnh và có khả năng mở rộng để bảo mật API của bạn. Bằng cách làm theo các bước được đề cập trong blog này, bạn có thể triển khai xác thực dựa trên mã thông báo một cách an toàn và bảo vệ hiệu quả các tài nguyên của bạn.
Bảo mật là một quá trình liên tục, và trong khi mã thông báo Bearer cung cấp nhiều lợi thế, hãy luôn cập nhật thông tin về các thực tiễn bảo mật tốt nhất và các mối đe dọa mới nhất. Với nền tảng này, bạn đã sẵn sàng xây dựng các API an toàn, có khả năng mở rộng và hiệu quả trong Node.js sử dụng Express.