Bỏ qua, đến nội dung

Auth & AuthManager

Auth là lớp xác thực request; AuthManager đăng ký kiểu xác thực và cung cấp JwtService.

1) Tổng quan kiến trúc

2) AuthManager - quản lý xác thực

APIMô tả
jwtJwtService - ký/verify JWT. Secret lấy từ options hoặc getDefaultJWTSecret() nếu thiếu.
registerTypes(authType, authConfig)Đăng ký loại xác thực (tên duy nhất) + class Auth tương ứng + title hiển thị admin.
setStorer(storer)Bắt buộc trước get(name, ctx): lấy cấu hình authenticator từ DB.
setTokenBlacklistServiceTích hợp blacklist token (revoke).
setTokenControlServiceKiểm soát token (renew, expire).
get(name, ctx)Tạo instance Auth theo authenticator name + context.
middleware()Koa middleware xác thực request.

Middleware flow

3) Lớp abstract Auth - chi tiết

skipCheck() - khi nào bỏ qua xác thực

Điều kiệnÝ nghĩaTình huống thực tế
ctx.skipAuthCheck = trueCode đánh dấu bỏ quaHealth check endpoint
Không có token + acl = falseHệ thống tắt ACLMôi trường dev/test
Action public (ACL allow)ACL đã cho phép publicLogin API, registration

check() - xác thực user

  • Trả currentUser (model).
  • Lớp con triển khai logic cụ thể:
    • Password auth: check username/password từ DB.
    • SSO auth: validate token từ identity provider.
    • Custom auth: logic tùy plugin.

checkToken() - trạng thái token

Trả về trạng thái:

StatusÝ nghĩa
validToken hợp lệ, chưa hết hạn
expiredToken đã hết hạn (cần refresh)
invalidToken không hợp lệ (signature sai, format lỗi)

4) Mã lỗi (AuthErrorCode)

CodeÝ nghĩa
EMPTY_TOKENRequest không có bearer token
EXPIRED_TOKENToken đã hết hạn
INVALID_TOKENToken không hợp lệ
BLOCKED_TOKENToken bị blacklist (revoke)
EXPIRED_SESSIONSession đã hết hạn
NOT_EXIST_USERUser trong token không tồn tại

Các lỗi này ném dưới dạng AuthError - client nhận HTTP 401 với error code rõ ràng.

5) JWT Service

  • JwtService xử lý sign/verify.
  • Có thể gắn blacklist (interface TokenBlacklistService) để revoke token.
  • Secret mặc định từ getDefaultJWTSecret() - không nên dùng trong production. Luôn set secret qua env/config.

JWT Secret

Nếu không cung cấp secret qua options, hệ thống dùng getDefaultJWTSecret() - một giá trị cố định không an toàn. Trong production, luôn set AUTH_JWT_SECRET trong biến môi trường.

6) Liên hệ Auth ↔ ACL

Vai tròAuthACL
Trách nhiệmXác định ai đang requestKiểm tra được phép làm gì
InputBearer token / sessionRole + resource + action
Outputctx.state.currentUserallow / deny + fixed params
Có thể bỏ qua?Có (public action, skipCheck)Có (allow manager, root role)
  • Auth middleware chạy trước ACL middleware trong pipeline.
  • Action public theo ACL có thể bỏ qua yêu cầu đăng nhập - xem skipCheck + AllowManager.isPublic.
  • Auth chỉ đảm bảo ctx.state.currentUser / token hợp lệ khi có. Không quyết định quyền truy cập.

7) Plugin mở rộng auth

Plugin có thể đăng ký auth type mới:

typescript
class MyAuthPlugin extends Plugin {
  async load() {
    this.app.authManager.registerTypes('my-sso', {
      auth: MySSOAuth,  // extends Auth
      title: 'My SSO Provider',
    });
  }
}

MySSOAuth cần implement ít nhất:

  • check() - logic xác thực.
  • Tùy chọn override skipCheck() nếu có logic đặc biệt.

Đọc tiếp