POST/api/v1/auth/login/otp手机号 / 邮箱 + OTP 登录
Try it 面板需要启用 JavaScript。
先经 otp/send(scene=login)发码并经 otp/verify 换取已验证工单,再登录。OTP 因素默认 60 分,单独达标。
Request
| Name | Data Type | Required | Description |
| Content-Type | string | Yes | 请求体内容类型(默认值 "application/json") |
type RequestHeaders = {
/** 请求体内容类型,默认值 "application/json" */
Content-Type: string
}
{
"Content-Type": "application/json"
}
Body
| Name | Data Type | Required | Description |
| verifyTicket | string | Yes | OTP 已验证工单(scene=login) |
type RequestBody = {
/** OTP 已验证工单(scene=login) */
verifyTicket: string
}
{
"verifyTicket": "otv_8a24de63b917c05f"
}
Response
Body
| Name | Data Type | Required | Description |
| status | string | Yes | pending 未达标 / satisfied 已达标并签发会话 |
| attemptTicket | string | No | 尝试工单;pending 时必返,后续因素验证继续携带 |
| nextFactors | array | No | pending 时按配置仍可选的因素 |
| sessionToken | string | No | 会话令牌(不透明);satisfied 时返回 |
| refreshToken | string | No | 刷新令牌;satisfied 时返回 |
| sessionId | string | No | 会话 ID;satisfied 时返回 |
| expiresAt | string | No | 会话过期时间;satisfied 时返回 |
type LoginResultDTO = {
/** pending 未达标 / satisfied 已达标并签发会话 */
status: string
/** 尝试工单;pending 时必返,后续因素验证继续携带 */
attemptTicket?: string
/** pending 时按配置仍可选的因素 */
nextFactors?: string[]
/** 会话令牌(不透明);satisfied 时返回 */
sessionToken?: string
/** 刷新令牌;satisfied 时返回 */
refreshToken?: string
/** 会话 ID;satisfied 时返回 */
sessionId?: string
/** 会话过期时间;satisfied 时返回 */
expiresAt?: string
}
{
"status": "pending",
"attemptTicket": "atk_9f2c7be14d0a53e8",
"nextFactors": [
"otp",
"mfa",
"captcha"
]
}
HTTP Code
| HTTP Status |
Meaning |
Notes |
| 200 |
成功 |
OTP 因素计入尝试;达标即签发会话 |
| 403 |
账号被冻结 |
管理员已冻结该账号 |
Response Code
响应使用统一信封 {id, code, messages, result},其 code 字段:
| code |
Meaning |
Notes |
| 0 |
成功 |
返回登录结果 |
| 2002 |
账号被冻结 |
管理员已冻结该账号 |
| 2202 |
OTP 工单无效 |
工单无效、过期或用途不符 |
Examples
POST /api/v1/auth/login/otp
Content-Type: application/json
{
"verifyTicket": "otv_8a24de63b917c05f"
}
{
"id": "01JD8SH3Q8N5M9WY",
"code": 0,
"messages": [],
"result": {
"status": "satisfied",
"sessionToken": "st_7c1f9e05b28d4a63",
"refreshToken": "rt_46a9c7e015283d5b",
"sessionId": "01JD8SEGVK6MZ7W3Q4RT5N8YB2",
"expiresAt": "2026-11-13T08:00:00Z"
}
}