Tóm tắt
GET /users/me và GET /users trả user không có field roles, trong khi role thật chỉ nằm trong claim
roles của access token. Client không có cách nào (ngoài decode JWT) để biết user hiện tại là
owner/system_admin, cũng không hiển thị được vai trò của thành viên khác trong danh bạ.
Chi tiết
Tái hiện trên localhost:3001 (2026-09-24), đăng nhập owner@saigonboiler.local:
GET /users/me → 200 { data: { id, organizationId, firstName, lastName, username, email, phone, avatarUrl,
title, birthday, address, managerId, status, userType, emailVerifiedAt,
timezone, locale, themeColor, createdAt, updatedAt } } ← không có roles
GET /users → 200 { data: [ ...cùng shape, không có roles ] }
access token payload → { sub, organizationId, roles: ["owner"], iat, exp }
- Mong đợi: user có
roles: string[](tên role trong tổ chức), khớp claim trong token. - Thực tế: không có
roles.
Ảnh hưởng phía FE:
/audit-logvà/app-permissions(IDENTITY-FE-004/005) crash khi đọcuser.rolesđể chặn quyền phía client. FE đã workaround (commitdb93467): đọc role từ payload access token (chỉ decode, không verify — chỉ phục vụ UX, RolesGuard ở BE vẫn là nơi chặn thật), fallbackuser.rolesnếu BE trả về sau này.MemberDetailSheet(danh bạ) đọcmember.roles.length— sẽ lỗi khi mở chi tiết thành viên với dữ liệu thật; chưa có workaround vì role của người khác không có trong token.
Contract (trước → sau)
| Trước (hiện tại) | Sau (mong muốn) | |
|---|---|---|
| Endpoint | GET /users/me, GET /users, GET /users/:id |
không đổi |
| Response | User không có roles |
User & { roles: string[] } (tên role, vd ["owner"]) |
| Lỗi | — | không đổi |
Việc bên nhận cần làm
- BE: thêm
roles: string[]vào response của/users/me,/users,/users/:id(đã cófindRoleNames(userId, organizationId)trongUserRepository, đang dùng lúc ký token ởLoginUseCase). Cập nhật Swagger/DTO tương ứng. - FE (sau khi BE
applied): có thể bỏ decode JWT ởrolesFromAccessToken(frontend/src/modules/identity/utils.ts) hoặc giữ làm fallback;MemberDetailSheethết lỗi.
Cách kiểm tra
GET /users/me với token của owner → response có "roles": ["owner"]. Trên UI: vào /members, mở chi tiết
1 thành viên → hiện danh sách vai trò, không lỗi.
Thảo luận
[FE] 2026-09-24 @NinelXram — raised
Phát hiện khi chạy IDENTITY-FE-004/005 với backend thật. FE đã workaround cho việc chặn quyền (decode claim
roles trong access token, commit db93467). Mobile n/a: mobile/ chưa có code.
[BE] 2026-09-24 @ThaiThanhLuan — applied
Sửa ở IDENTITY-029 (nhánh fix/IDENTITY-029-users-missing-roles): GET /users/me, GET /users, GET /users/:id
và cả POST/PATCH /users trả roles: string[] (tên role trong tổ chức, đọc từ DB; [] nếu không có role).
GET /users tra role của cả danh sách bằng 1 query. Role trong DB luôn mới hơn claim trong token (token chỉ đổi
khi refresh) — FE nên ưu tiên user.roles, giữ decode JWT làm fallback nếu muốn.