Skip to main content
econtractid có hai loại thông tin xác thực cho hai mục đích khác nhau: API Key lại có hai loại, cấp cho hai việc khác nhau — dùng nhầm sẽ bị từ chối:

API Key

Mọi request tới Integration API gửi kèm header X-API-Key:
Chỉ tên header X-API-Key được chấp nhận (viết hoa thường tuỳ ý — HTTP không phân biệt). Alias cũ apikey đã bị bỏ: gửi bằng tên đó thì request bị coi như không có API Key và sẽ nhận 401 từ tầng xác thực JWT, chứ không phải lỗi API Key.
API Key được cấp khi onboard tổ chức và chỉ hiển thị 1 lần. Lưu trong biến môi trường hoặc secret manager, không commit vào source code.

Lỗi liên quan tới API Key

Mọi lỗi đều trả 401 với code: "UNAUTHORIZED"; nguyên nhân nằm trong message:
Key bị thu hồi và key hết hạn trả về cùng thông báo với key sai — hệ thống không phân biệt ra ngoài. Chi tiết: Mã lỗi.

Lấy Access Token — Partner Login

Khi bạn muốn nhúng giao diện econtractid (iframe trên web hoặc SDK mobile), người dùng cuối cần một access token. Backend của bạn dùng API Key để đổi lấy token cho một người dùng cụ thể:

Request

API Key chỉ được đọc từ header x-api-key, không bao giờ đặt trong body — thông tin nhạy cảm trong body dễ lọt vào access log và báo cáo lỗi.

Response

Trả về HTTP 201 (mặc định của POST), body bọc trong envelope chuẩn:
userInfo ở trên là bản rút gọn. Response thật còn có address, avatar, memberOf, updatedAt, và các trường chữ ký (defaultSignature, imageSignatures, backgroundSignatures).status là số (1 = chờ kích hoạt, 2 = đang hoạt động). organizationId bằng -1 với người dùng bên ngoài — đây là giá trị bình thường, không phải lỗi.
Response không trả về refreshTokenkhông trả về expiresIn. Xem mục Vòng đời token bên dưới.Lưu ý statusCode trong body luôn là 200 kể cả khi HTTP status là 201 — hãy dựa vào HTTP status thật của response, không dựa vào trường này.

Lỗi

Giới hạn quan trọng

Endpoint này không tạo người dùng. Username chưa tồn tại → trả 404. Người ký phải được onboard trước qua luồng tạo hồ sơ thông thường (khai báo trong signers[] khi gọi POST /documents).Endpoint chỉ cấp token cho người dùng là thành viên của tổ chức tương ứng — cả người ký bên ngoài (external) lẫn nhân sự nội bộ (internal). Tài khoản quản trị hệ thống (super admin) bị từ chối (403), vì token này được cấp không qua mật khẩu.
Token cấp qua partner-login không cần mật khẩu. Ai giữ API Key đều có thể lấy token của bất kỳ người dùng external nào trong tổ chức. API Key tuyệt đối không được để lộ xuống trình duyệt hoặc ứng dụng di động — chỉ gọi từ backend.

Dùng access token gọi API

Token gửi qua header x-access-token, giá trị là JWT thuần:
Không dùng Authorization: Bearer <token>. Hệ thống chỉ đọc token từ header x-access-token, và không có tiền tố Bearer. Gửi sai tên header — hoặc thêm tiền tố Bearer — thì request bị coi như không có token và trả 401 mà không kèm mô tả.
Các endpoint Integration API nhận cả hai cách xác thực: X-API-Key (người dùng = tài khoản gắn với key) hoặc x-access-token (người dùng = chủ sở hữu token). Gửi kèm cả hai thì API Key được ưu tiên, token bị bỏ qua — nên chỉ gửi một.

401 khi token trông vẫn hợp lệ

Tầng xác thực chỉ kiểm tra chữ ký và hạn dùng của token, không kiểm tra quyền. Nhận 401 nghĩa là token/header sai — vấn đề về quyền hạn trả 403, còn dữ liệu không thuộc phạm vi người dùng trả 404.

Vòng đời token

Vì hệ thống không có endpoint refresh, luồng xử lý khi token hết hạn là lấy token mới:
15 ngày là thời hạn dài. Hãy đối xử với access token như một thông tin xác thực:
  • Không ghi token vào log
  • Không lưu lâu dài ở phía client
  • Không nhúng token vào URL có thể bị chia sẻ, bookmark hoặc lưu vào lịch sử trình duyệt
  • Khi nghi ngờ lộ token: thu hồi API Key và cấp key mới

Áp dụng vào tích hợp

Nhúng web (iframe)

Truyền token qua query param at

SDK Flutter

Truyền token vào openTaskList(), làm mới bằng updateAccessToken()