- vừa được xem lúc

Xây dựng hệ thống xác thực JWT trong ứng dụng Node.js chỉ với 8 bước đơn giản

0 0 2

Người đăng: Vinh Phạm

Theo Viblo Asia

Xác thực JWT (JSON Web Token) là phương pháp phổ biến để bảo mật ứng dụng web. Nó cho phép giao tiếp an toàn và xác minh danh tính, lý tưởng cho API. Bài viết này sẽ hướng dẫn bạn thực hiện xác thực JWT trong ứng dụng Node.js sử dụng MongoDB để lưu trữ dữ liệu.

Xác thực JWT là gì?

Xác thực JWT sử dụng JSON Web Token để xác minh danh tính người dùng trong ứng dụng web. Một JWT bao gồm ba phần: Header, Payload và Signature.

Phần Header chứa loại token và phương thức mã hóa. Phần Payload lưu trữ thông tin người dùng, chẳng hạn như tên người dùng và vai trò. Phần Signature xác minh tính hợp lệ của token, đảm bảo tính toàn vẹn dữ liệu. Token được người dùng trình bày để truy cập tài nguyên, hoạt động như bằng chứng về danh tính của họ.

Thiết lập dự án và kết nối Cơ sở dữ liệu

Bước 1: Thiết lập dự án

Để bắt đầu, hãy tạo một thư mục mới và khởi tạo dự án:

mkdir nodejs-jwt-auth
cd nodejs-jwt-auth
npm init -y

Cài đặt các dependency cần thiết:

npm install express mongoose jsonwebtoken dotenv

Trong đó:

  • express : Nền tảng để xây dựng máy chủ web.
  • mongoose : Thư viện MongoDB để xử lý mô hình dữ liệu.
  • jsonwebtoken : Thư viện để tạo và xác minh JWT.
  • dotenv : Quản lý các biến môi trường một cách an toàn.

Bước 2: Kết nối với MongoDB

Sử dụng MongoDB Atlas để lưu trữ đám mây. Đăng nhập vào MongoDB Atlas và lấy chuỗi kết nối của bạn.

Trong file .env, hãy thêm vào như sau:

MONGODB_URL='mongodb+srv://your-username:your-password@cluster.mongodb.net/your-database'
SECRET_KEY='your_secret_key'

Hãy thay thế các placeholder bằng thông tin đăng nhập của bạn.

Bước 3: Cấu hình môi trường với tệp .env

Tạo một file .env để lưu trữ URL MongoDB và khóa bí mật cho JWT.

MONGODB_URL='your-mongodb-connection-string'
SECRET_KEY='your-secret-key'

Bước 4: Thiết lập ứng dụng Express

Tạo file index.js để cấu hình kết nối Express và MongoDB:

const express = require("express");
const mongoose = require("mongoose");
require("dotenv").config(); const app = express();
const port = 3000; app.use(express.json()); mongoose.connect(process.env.MONGODB_URL, { useNewUrlParser: true, useUnifiedTopology: true,
}).then(() => console.log("MongoDB connected")) .catch(error => console.error("Connection error", error)); app.listen(port, () => console.log(`Server running on port ${port}`));

Chạy ứng dụng:

node index.js

Để khởi động lại tự động, hãy cài đặt nodemon :

npm install -g nodemon
nodemon index.js

Bước 5: Tạo mô hình người dùng

Xác định schema User trong models/User.js:

const mongoose = require("mongoose"); const userSchema = new mongoose.Schema({ username: { type: String, required: true, unique: true }, password: { type: String, required: true },
}); module.exports = mongoose.model("User", userSchema);

Bước 6: Xây dựng các tuyến xác thực

Trong routes/auth.js, xác định các routes đăng ký và đăng nhập để tạo người dùng và tạo token JWT.

const express = require("express");
const jwt = require("jsonwebtoken");
const User = require("../models/User"); const router = express.Router(); router.post("/signup", async (req, res) => { try { const { username, password } = req.body; const user = new User({ username, password }); await user.save(); res.status(201).json({ message: "User registered successfully" }); } catch (error) { res.status(500).json({ message: "Internal Server Error" }); }
}); router.post("/login", async (req, res) => { const { username, password } = req.body; try { const user = await User.findOne({ username }); if (!user || user.password !== password) { return res.status(401).json({ message: "Invalid credentials" }); } const token = jwt.sign({ id: user._id, username: user.username }, process.env.SECRET_KEY); res.json({ token }); } catch (error) { res.status(500).json({ message: "Internal Server Error" }); }
}); module.exports = router;

Bước 7: Bảo mật route bằng phần mềm trung gian

Tạo file middleware.js để xác minh JWT:

const jwt = require("jsonwebtoken"); function verifyJWT(req, res, next) { const token = req.headers["authorization"]; if (!token) { return res.status(401).json({ message: "Access denied" }); } jwt.verify(token, process.env.SECRET_KEY, (err, user) => { if (err) { return res.status(403).json({ message: "Invalid token" }); } req.user = user; next(); });
} module.exports = verifyJWT;

Bước 8: Kiểm tra API

Đăng ký bằng cách POST tới /auth/signup với body JSON:

{ "username": "john_doe", "password": "securepass" }

Đăng nhập bằng cách POST tới /auth/login với cùng thông tin đăng nhập:

{ "username": "john_doe", "password": "securepass" }

Cuối cùng, truy cập Route được bảo vệ bằng cách gửi yêu cầu GET tới /protected với token JWT trong header Authorization:

Như vậy bạn đã triển khai thành công xác thực JWT trong ứng dụng Node.js. Thiết lập này bảo mật các tuyến API của bạn, chỉ cho phép người dùng đã xác thực truy cập chúng.

Bình luận

Bài viết tương tự

- vừa được xem lúc

Cài đặt WSL / WSL2 trên Windows 10 để code như trên Ubuntu

Sau vài ba năm mình chuyển qua code trên Ubuntu thì thật không thể phủ nhận rằng mình đã yêu em nó. Cá nhân mình sử dụng Ubuntu để code web thì thật là tuyệt vời.

0 0 396

- vừa được xem lúc

Hướng dẫn làm bot Facebook messenger cho tài khoản cá nhân

Giới thiệu. Trong bài viết trước thì mình có hướng dẫn các bạn làm chatbot facebook messenger cho fanpage. Hôm nay mình sẽ hướng dẫn các bạn tạo chatbot cho một tài khoản facebook cá nhân. Chuẩn bị.

0 0 195

- vừa được xem lúc

Crawl website sử dụng Node.js và Puppeteer - phần 2

trong phần 1 mình đã giới thiệu về puppeteer và tạo được 1 project cùng một số file đầu tiên để các bạn có thể crawl dữ liệu từ một trang web bất kỳ. Bài này mình sẽ tiếp nối bài viết trước để hoàn thiện seri này.

0 0 73

- vừa được xem lúc

Điều React luôn giữ kín trong tim

■ Mở đầu. Ngồi viết bài khi đang nghĩ vu vơ chuyện con gà hay quả trứng có trước, mình phân vân chưa biết sẽ chọn chủ đề gì để chúng ta có thể cùng nhau bàn luận.

0 0 59

- vừa được xem lúc

Gửi Mail với Nodejs và AWS SES

AWS SES. AWS SES là gì.

0 0 83

- vừa được xem lúc

Crawl website sử dụng Node.js và Puppeteer - phần 1

Bài viết này mình sẽ giới thiệu cho các bạn craw dữ liệu của web site sử dụng nodejs và Puppeteer. .

0 0 164