HRMNhân viên

Đổi công ty đang làm việc

Chuyển phiên đăng nhập sang một công ty khác của cùng tài khoản mà không cần đăng nhập lại.

Một tài khoản có thể là nhân viên của nhiều công ty (cửa hàng). Mỗi JWT Token chỉ gắn với một công ty, vì vậy để làm việc với công ty khác, gọi API này để nhận JWT Token mới cho công ty đích. Danh sách công ty có thể đổi sang lấy từ Danh sách công ty của tôi (các phần tử có switchable = true).

Endpoint

POST /v1/usersessions/switchcompany

Headers

TênGiá trịBắt buộcMô tả
Authorization<JWT>CóUser Login Token hiện tại. API này không dùng được với API Key.
Content-Typeapplication/jsonCó

Request Body

TênKiểuBắt buộcMô tả
target_company_idintCóID của công ty muốn chuyển sang

Dùng target_company_id, không dùng company_id (tham số company_id nếu có trong body sẽ được hiểu là công ty hiện tại và bị bỏ qua).

Response Schema

HTTP 200 - JSON Object

Giống response của Đăng nhập - Bước 2, kèm thêm switched_from_company_id:

{
  "jwt": "0123456789abcdef0123456789abcdef",
  "refresh_token": "a1b2c3d4e5f6...",
  "id": 1,
  "email": "[email protected]",
  "full_name": "Nguyễn Văn A",
  "role": "1,100,102,103,110",
  "company": { "id": 10500, "name": "Chi nhánh Hà Nội", ... },
  "employee": { "id": 205, "company_id": 10500, "user_id": 1, ... },
  "company_list": [
    { "id": 101, "user_id": 1, "company": { ... }, "employee": { ... }, "access": "full" },
    { "id": 205, "user_id": 1, "company": { ... }, "employee": { ... }, "access": "full" }
  ],
  "access": "full",
  "access_state": "trial",
  "switched_from_company_id": 10311
}
FieldMô tả
jwtJWT Token mới, gắn với công ty đích
refresh_tokenRefresh token của phiên mới
company, employeeThông tin công ty đích và nhân viên trong công ty đích
roleDanh sách mã quyền của nhân viên trong công ty đích
company_listDanh sách công ty của tài khoản
access, access_state(Chỉ có trên Hubport SaaS) Trạng thái truy cập của công ty đích, xem Đăng nhập
switched_from_company_idID công ty trước khi đổi

Workflow & Logic

  1. Kiểm tra request dùng JWT của người dùng (không phải API Key).
  2. Kiểm tra target_company_id khác công ty hiện tại.
  3. Kiểm tra giới hạn: tối đa 10 lần đổi công ty / 60 giây cho mỗi tài khoản.
  4. Kiểm tra tài khoản là nhân viên (chưa bị xoá, đang hoạt động) của công ty đích, công ty đích đang hoạt động và (trên Hubport SaaS) không bị khoá.
  5. Tạo phiên đăng nhập mới cho công ty đích và trả về JWT mới.
  6. Phiên cũ bị vô hiệu ngay: JWT cũ không dùng được nữa (trả lỗi error_jwt_blacklisted). Ứng dụng phải thay JWT cũ bằng JWT mới cho các request tiếp theo.

API này vẫn gọi được khi công ty hiện tại đang bị khoá (error_company_locked), để người dùng chuyển sang công ty khác.

Error Codes

HTTPCodeMô tả
401error_session_not_foundKhông tìm thấy phiên đăng nhập hiện tại
401error_user_not_foundKhông tìm thấy tài khoản
403error_switch_company_session_requiredRequest không dùng JWT của người dùng (ví dụ dùng API Key)
403error_impersonation_switch_company_deniedPhiên hỗ trợ chỉ đọc của nhân viên Hubport không được đổi công ty
403error_employee_disabledTài khoản đang bị vô hiệu hoá trong công ty đích
403error_company_disabledCông ty đích đang bị vô hiệu hoá
403error_target_company_lockedCông ty đích đang bị khoá. Response có thêm detail.reason, detail.state
403error_two_factor_session_requiredTài khoản đã bật xác thực 2 lớp hoặc công ty đích bắt buộc 2FA, mà phiên hiện tại chưa đăng nhập bằng 2FA: đăng nhập lại vào công ty đích (bước 2 và 3 của Đăng nhập)
404error_company_not_foundKhông tìm thấy công ty đích hoặc tài khoản không thuộc công ty đó
422error_target_company_id_requiredThiếu target_company_id
422error_switch_company_sameCông ty đích trùng với công ty hiện tại
429error_rate_limit_exceedĐổi công ty quá nhiều lần (tối đa 10 lần / 60 giây)
500error_session_can_not_be_savedLỗi tạo phiên làm việc mới

Ví dụ

curl -X POST https://api.hubport.vn/v1/usersessions/switchcompany \
  -H "Authorization: <JWT>" \
  -H "Content-Type: application/json" \
  -d '{"target_company_id": 10500}'

Ví dụ lỗi khi công ty đích bị khoá:

{
  "error": ["error_target_company_locked"],
  "detail": { "reason": "suspended", "state": "suspended" }
}

On this page