Giao diện
Chạy dev không có IAM
bash
# .env
NUXT_AUTH_MOCK=trueToà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ì
| Route | Hành vi khi bật mock |
|---|---|
POST /auth/login | Nhậ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/clients | Trả hai ứng dụng mẫu cho dropdown |
POST /auth/otp/send | Trả transactionId: 'mock-transaction', không gửi gì đi đâu |
GET /auth/session | Trả 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 403Nhánh toàn quyền — người dùng giả có role admin, khai role đó là super-role:
bash
NUXT_PUBLIC_AUTH_SUPER_ROLES=adminBộ 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_MOCKkhông xuất hiện trong biến CI/CD của môi trường dev chung, staging, prod. - [ ]
NUXT_AUTH_BASE_URLtrỏ 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/sessiontrả đủrolesvàpermissionstừ 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
- Cấu hình IAM — chuyển sang endpoint thật.
- Phiên đăng nhập — cookie và
NUXT_SESSION_SECRET. - Chặn theo quyền — các nhánh cần thử.