sync/identity/2026-09-24-fe-users-me-missing-roles.md · Xem trên GitHub

GET /users/me và GET /users không trả field roles

Đã đóng normal bug-report
Module
identity
Từ
FE
Người raise
NinelXram
Ngày tạo
2026-09-24
Refs
IDENTITY-FE-004, IDENTITY-FE-005, IDENTITY-029
Bên nhận
BE appliedMobile n/a

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-log và /app-permissions (IDENTITY-FE-004/005) crash khi đọc user.roles để chặn quyền phía client. FE đã workaround (commit db93467): đọ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), fallback user.roles nếu BE trả về sau này.
  • MemberDetailSheet (danh bạ) đọc member.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) trong UserRepository, đ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; MemberDetailSheet hế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.