Autentikasi
Đăng Ký (4 Bước)
Đăng ký yêu cầu xác minh email, mật khẩu và tên hiển thị:
Bước 1: Gửi Mã Xác Minh
POST /auth/send-code{ "email": "user@example.com", "scene": "register", "turnstile_token": "..."}Bước 2: Đăng Ký
POST /auth/register{ "email": "user@example.com", "code": "123456", "account_password": "your-password", "display_name": "Your Name", "device_locale": "en-US"}Trả về access token và refresh token (dưới dạng HttpOnly cookie).
Bước 3: Client Tạo Khóa
Sau đăng ký, client:
- Tạo cặp khóa X25519
- Dẫn xuất khóa mã hóa:
Argon2id(protection_password, random_salt) - Mã hóa khóa riêng:
AES-GCM(derived_key, private_key)
Bước 4: Tải Bản Sao Khóa
POST /keys/backup{ "backup_a": "base64-encrypted-private-key", "argon2_salt": "base64-salt", "public_key": "base64-public-key", "device_id": "device-uuid"}Đăng Nhập
Hỗ trợ ba phương thức đăng nhập:
Đăng Nhập Bằng Mật Khẩu
POST /auth/login{ "email": "user@example.com", "account_password": "your-password", "turnstile_token": "..."}Khóa tài khoản: Sau 5 lần đăng nhập thất bại, tài khoản bị khóa 15 phút. Trả về 423 ACCOUNT_LOCKED với retry_after tính bằng giây.
Đăng Nhập Bằng Mã Xác Minh
POST /auth/send-code{ "email": "user@example.com", "scene": "login", "turnstile_token": "..." }
POST /auth/login-code{ "email": "user@example.com", "code": "123456" }Đăng Nhập Passkey
Passkey thay thế mật khẩu tài khoản trong bước xác thực. Mật khẩu bảo vệ (cho giải mã khóa) vẫn cần trên thiết bị mới.
POST /auth/passkey/begin # Trả về challenge (endpoint công khai)POST /auth/passkey/complete # Xác minh chữ ký, phát hành token (endpoint công khai)Đăng nhập Passkey sử dụng WebAuthn Conditional UI — không có nút rõ ràng trên màn hình đăng nhập. Prompt Passkey hệ thống tự động xuất hiện trên thiết bị hỗ trợ.
Làm Mới Token
Access token hết hạn sau 5 phút. Dùng refresh token để lấy cặp mới:
POST /auth/refreshRefresh token được lưu dưới dạng HttpOnly cookie với các thuộc tính:
Set-Cookie: refresh_token=...; HttpOnly; Secure; SameSite=Strict; Path=/auth; Max-Age=2592000Đặt Lại Mật Khẩu
Đặt lại mật khẩu tài khoản không ảnh hưởng khóa mã hóa:
POST /auth/send-code{ "email": "user@example.com", "scene": "reset", "turnstile_token": "..." }
POST /auth/reset-password{ "email": "user@example.com", "code": "123456", "new_account_password": "new-password" }Xác Thực Agent
Agent sử dụng token lâu dài thay vì JWT:
Authorization: Bearer hsk_your-agent-tokenĐịnh dạng token là hsk_ + 40 ký tự base62. Máy chủ lưu hash bcrypt.
Xác Thực WebSocket
Với kết nối WebSocket, token được gửi trong frame đầu tiên (không bao giờ trong URL):
{ "type": "auth", "token": "hsk_...", "agent_id": "your-agent-id" }Máy chủ phản hồi { "type": "auth.ok" } hoặc { "type": "auth.error", "reason": "..." }.
Tái Tạo Token
POST /agents/:id/token/regenerate{ "emergency": false }| Chế độ | Token cũ | Khóa công khai cũ |
|---|---|---|
Bình thường (emergency: false) | Hợp lệ 7 ngày | Hợp lệ 7 ngày |
Khẩn cấp (emergency: true) | Thu hồi ngay | Thu hồi ngay |
Bước Tiếp Theo
- REST Endpoint — Danh sách endpoint đầy đủ
- Tổng Quan API — URL gốc và định dạng
- Mã Lỗi — Mã lỗi xác thực