Class 07: Authentication – JWT

Authentication (xác thực) là bước quan trọng để đảm bảo người dùng truy cập vào hệ thống một cách an toàn và có quyền hạn phù hợp. JWT (JSON Web Token) là một tiêu chuẩn phổ biến để thực hiện xác thực không trạng thái (stateless authentication).


Xác thực với JWT

JWT là gì?

JWT là một chuỗi gồm 3 phần: header, payload, và signature, dùng để truyền tải thông tin xác thực giữa client và server một cách an toàn. Token này có thể được gửi trong header Authorization của HTTP request.

Quy trình xác thực JWT

  • Người dùng đăng nhập (login) bằng username/password.

  • Server kiểm tra thông tin, nếu đúng sẽ tạo ra JWT chứa payload (ví dụ userId).

  • Client lưu token và gửi trong các request tiếp theo.

  • Server dùng secret key để xác thực token, cho phép truy cập tài nguyên bảo vệ.

Các bước cài đặt JWT trong NestJS

  • Cài đặt các package: @nestjs/jwt, passport-jwt, bcrypt

npm install @nestjs/jwt passport-jwt bcrypt
npm install --save-dev @types/bcrypt

Đăng ký, đăng nhập, mã hóa mật khẩu bằng bcrypt

Mã hóa mật khẩu

  • bcrypt giúp mã hóa mật khẩu người dùng trước khi lưu vào database.

  • Hàm hash() tạo mật khẩu mã hóa.

  • Hàm compare() so sánh mật khẩu người dùng nhập với mật khẩu đã mã hóa.

Ví dụ mã hóa mật khẩu

Đăng ký (Register) – lưu user với mật khẩu đã mã hóa


Sử dụng Passport.js với chiến lược JWT

Passport là gì?

Passport là middleware hỗ trợ đa dạng các chiến lược xác thực (OAuth, JWT, local...). NestJS tích hợp Passport rất tốt, giúp xây dựng hệ thống auth đơn giản và rõ ràng.

Cấu hình chiến lược JWT với Passport

Tạo AuthService để xử lý đăng nhập và tạo JWT

Bảo vệ route bằng Guard Passport JWT

Sử dụng Guard trong controller:


Thực hành: Xây dựng hệ thống auth cơ bản

Bước 1: Tạo module auth

Bước 2: Cài đặt và cấu hình JWT module

Bước 3: Viết Controller xử lý đăng ký, đăng nhập

Bước 4: Bảo vệ route bằng JwtAuthGuard


Bài tập thực hành

  • Cài đặt module auth theo hướng dẫn

  • Viết endpoint đăng ký (register) và đăng nhập (login)

  • Sử dụng bcrypt để mã hóa mật khẩu khi đăng ký

  • Sử dụng JWT để tạo token khi đăng nhập thành công

  • Viết route bảo vệ bằng JwtAuthGuard

  • Dùng Postman test:

    • Đăng ký user mới

    • Đăng nhập để lấy token

    • Gửi token trong header Authorization: Bearer <token> để truy cập route bảo vệ


Tổng kết

  • JWT là chuẩn xác thực phổ biến, hỗ trợ xây dựng hệ thống auth không trạng thái

  • bcrypt mã hóa mật khẩu giúp bảo mật thông tin người dùng

  • NestJS tích hợp Passport.js giúp dễ dàng tạo chiến lược JWT

  • Cần kết hợp middleware, guard để đảm bảo an toàn cho API

Last updated