Skip to content

Chạy dev không có IAM

bash
# .env
NUXT_AUTH_MOCK=true

Toàn bộ luồng đăng nhập chạy end-to-end mà không gọi IAM: tiện khi chưa được cấp endpoint, khi làm việc offline, hoặc khi chạy kiểm thử tự động.

Chế độ mock làm gì

RouteHành vi khi bật mock
POST /auth/loginNhận mọi tên đăng nhập và mật khẩu (chỉ cần không rỗng), tạo phiên giả
GET /auth/clientsTrả hai ứng dụng mẫu cho dropdown
POST /auth/otp/sendTrả transactionId: 'mock-transaction', không gửi gì đi đâu
GET /auth/sessionTrả người dùng lưu trong cookie, không gọi userInfo
/api/**Không đổi — vẫn proxy tới NUXT_API_PROXY_TARGET như thường, nhưng phiên giả không có access token nên request đi ra không kèm Authorization

Người dùng giả:

ts
{
  id: 'mock-user',
  name: 'Người dùng <tên vừa nhập>',
  email: '<tên vừa nhập>@tasco.vn',
  roles: ['admin'],
  permissions: ['/orders/search', '/orders/create', '/orders/update'],
}

Cookie phiên vẫn được mã hoá và ký thật, chỉ khác là không chứa token IAM. Ở dev, để trống NUXT_SESSION_SECRET thì dùng khoá tạm kèm cảnh báo trong console — bình thường.

Thử các nhánh phân quyền

Ba quyền mặc định vừa đủ cho màn hình danh sách mẫu. Muốn thử nhánh khác:

Nhánh thiếu quyền — khai một URI không nằm trong ba quyền trên:

ts
definePageMeta({ permissions: ['/orders/delete'] })   // sẽ thấy trang 403

Nhánh toàn quyền — người dùng giả có role admin, khai role đó là super-role:

bash
NUXT_PUBLIC_AUTH_SUPER_ROLES=admin

Bộ quyền riêng — tạo route cùng đường dẫn trong dự án, nó thắng route của layer:

ts
// server/routes/auth/login.post.ts — CHỈ dùng khi phát triển
export default defineEventHandler(async (event) => {
  const body = await readBody<{ username?: string }>(event)
  const user = {
    id: 'dev-user',
    name: body.username ?? 'Dev',
    roles: ['MANAGER'],
    permissions: ['/orders/search', '/orders/approve', '/reports/view'],
  }
  setTascoSession(event, { user })
  return { user }
})

Nhớ xoá trước khi lên nhánh chính

Route này thay hẳn đường đăng nhập thật. Giữ trong nhánh cá nhân, đừng merge.

Trong kiểm thử tự động

Mock cho phép kịch bản end-to-end đi qua màn hình đăng nhập mà không cần tài khoản thật:

yaml
# .gitlab-ci.yml của dự án
e2e:
  variables:
    NUXT_AUTH_MOCK: "true"
    NUXT_SESSION_SECRET: "chuoi-ngau-nhien-du-32-ky-tu-cho-ci-chay"

Đặt luôn NUXT_SESSION_SECRET để log CI không đầy cảnh báo.

Trước khi lên môi trường thật

  • [ ] NUXT_AUTH_MOCK không xuất hiện trong biến CI/CD của môi trường dev chung, staging, prod.
  • [ ] NUXT_AUTH_BASE_URL trỏ IAM thật và đăng nhập được bằng tài khoản thật.
  • [ ] NUXT_SESSION_SECRET đã đặt (≥ 32 ký tự ngẫu nhiên), không phải chuỗi mẫu trong tài liệu.
  • [ ] GET /auth/session trả đủ rolespermissions từ IAM.

Mock ở production là lỗ hổng xác thực

Bật mock nghĩa là bất kỳ ai gõ tên đăng nhập bất kỳ cũng vào được app với quyền có sẵn. Biến này chỉ tồn tại ở máy dev.

Liên quan