Skip to content

认证 API ​

账号密码登录 ​

POST /api/auth/login ​

Body:

json
{
  "username": "admin",
  "password": "your_password",
  "rememberMe": false
}

Response (成功,无 2FA):

json
{
  "accessToken": "eyJhbGciOi...",
  "refreshToken": "eyJhbGciOi...",
  "user": {
    "id": "uuid",
    "username": "admin",
    "email": "[email protected]",
    "role": "admin"
  }
}

Response (需要 2FA):

json
{
  "requires2FA": true,
  "tempToken": "eyJhbGciOi...",
  "methods": ["totp", "passkey", "email"]
}

rememberMe 决定刷新令牌的生命周期:

  • true:持久 Cookie(7 天),刷新时重新签发 7 天,属滑动续期。
  • false(默认):会话级 Cookie,刷新令牌在登录后 24 小时绝对到期。 刷新只延续剩余时间,不会延长截止点;即使浏览器恢复了会话 Cookie, 超过 24 小时也必须重新登录。

POST /api/auth/refresh ​

通过 HttpOnly Cookie 中的 refresh_token 刷新 Access Token。

Response:

json
{
  "accessToken": "eyJhbGciOi...",
  "refreshToken": "eyJhbGciOi..."
}

错误码:

状态码code说明
401REFRESH_TOKEN_MISSING缺少刷新令牌
401REFRESH_TOKEN_INVALID令牌无效或已过期,会话结束并清除 Cookie
401REFRESH_TOKEN_REUSED令牌刚被其他请求消费(多标签页竞态),稍后重试即可
503REFRESH_UNAVAILABLE服务端临时故障,保留 Cookie,可稍后重试

REFRESH_TOKEN_REUSED 只在令牌被消费后的 60 秒宽限窗口内返回。数据库里查不到 令牌(已登出、已被吊销、从未登记)或令牌已过期,一律返回 REFRESH_TOKEN_INVALID 并清除 Cookie;宽限窗口之后再次使用已消费的令牌视为重放,服务端会撤销整条轮换链。

POST /api/auth/logout ​

吊销当前 refresh token。

2FA 验证 ​

POST /api/2fa/verify ​

Headers: Authorization: Bearer <tempToken>

Body (TOTP):

json
{
  "method": "totp",
  "code": "123456"
}

Body (Passkey):

json
{
  "method": "passkey",
  "credential": { ... }
}

Body (邮箱验证码):

json
{
  "method": "email",
  "code": "123456"
}

Response:

json
{
  "accessToken": "eyJhbGciOi...",
  "refreshToken": "eyJhbGciOi...",
  "user": { ... }
}

OAuth / OIDC 登录 ​

完整说明见 OAuth / OIDC API。

摘要:

接口说明
GET /api/auth/oauth/providers已启用提供商
GET /api/auth/oauth/:id/authorize跳转授权
GET /oauth/oidcOIDC 重定向 URL(简洁路径)
POST /api/auth/oauth/exchange-ticketticket 换 accessToken
POST /api/auth/oauth/:id/bind/start发起账号绑定
POST /api/auth/oauth/:id/register邀请码完成注册

:providerId 可为 oidc / github / gitlab / google / dingtalk / feishu / custom(兼容)。

用户资料 ​

GET /api/auth/me ​

获取当前登录用户信息(含 notificationsEnabled、emailNotificationsEnabled)。

PUT /api/auth/me/profile ​

更新用户资料。

Body 示例:

json
{
  "displayName": "张三",
  "nickname": "san",
  "avatarUrl": "https://...",
  "notificationsEnabled": true,
  "emailNotificationsEnabled": false
}

PUT /api/auth/me/password ​

修改密码。需要验证旧密码。

PUT /api/auth/me/email ​

修改邮箱。需要验证当前密码。

用户令牌 ​

GET /api/auth/me/tokens ​

获取个人令牌列表。

POST /api/auth/me/tokens ​

创建个人令牌。

Body:

json
{
  "name": "CI/CD Token",
  "permissions": ["records:read", "records:write"]
}

Response:

json
{
  "token": "dmhub_pt_xxxxxxxx",
  "id": "uuid",
  "name": "CI/CD Token",
  "permissions": ["records:read", "records:write"],
  "createdAt": "2026-01-01T00:00:00.000Z"
}

DELETE /api/auth/me/tokens/:id ​

吊销个人令牌。

AGPL-3.0 协议