两步验证(2fa)

特性定义

  • 2fa:表示服务端允许两步验证

  • 2fa_enforced:表示服务端强制启用两步验证。
    依赖 2fa,特性列表中不应只出现 2fa_enforced 而不存在 2fa
    当服务端强制启动两步验证时,所有新注册用户均须在注册时开启两步验证。当用户未启用两步验证时,只有以下接口可用:

    • 用户登出
    • 用户注销
    • 绑定 2FA

    访问其他接口均会产生错误:202000:用户未启用两步验证。
    客户端应引导已注册但未开启两步验证的用户尽快开启两步验证。

适用范围

  • 用户注册(POST /api/user/register
  • 用户登录(POST /api/user/login
  • 用户注销(POST /api/user/revoke
  • 用户信息(GET /api/user/info
  • 用户修改密码(PATCH /api/user/password

TODO: 列举出用到 2FA 的所有位置

请求参数

参数名类型详情
2fa_secretstring两步验证的 Secret,注册时由客户端生成,发送至服务端。
2fa_code\d{6}两步验证的代码。当用户未开启两步验证时,该字段填入任何值均可。

影响结构

2fa_enforced 启用时,以下所有新增参数均为 Required

用户注册

interface UserRegisterBody {
  // ...
  "2fa_secret"?: string;
  "2fa_code"?: string;
}

用户登录

interface UserLoginBody {
  // ...
  "2fa_code"?: string;
}

interface UserInfo {
  // ...
  "2fa_enabled"?: boolean;
}

用户注销

interface UserRevokeBody {
  "2fa_code"?: string;
}

用户信息

interface UserInfo {
  // ...
  "2fa_enabled"?: boolean;
}

用户修改密码

interface UserChangePasswordBody {
  // ...
  "2fa_code"?: string;
}

绑定 2FA

2FA 为可选项时,用户可以使用该接口绑定两步验证。当 2fa_enforced 启用时,未开启两步验证的用户可以通过该接口开启两步验证。

Endpoint

POST /api/features/2fa

请求

请求参数

参数名类型详情
2fa_secretstring两步验证的 Secret,由客户端生成后发送至服务端。
2fa_code\d{6}两步验证的代码。

错误列表

错误代码详情
202001两步验证代码错误
202002两步验证 Secret 非法
202004用户已启用两步验证,无法重复绑定

取消绑定 2FA

用户可以使用该接口取消当前已绑定的两步验证。

Endpoint

DELETE /api/features/2fa

请求

请求参数

参数名类型详情
2fa_code\d{6}两步验证的代码。

错误列表

错误代码详情
202000用户未启用两步验证
202001两步验证代码错误
202003两步验证已达尝试上限

完整错误列表

错误代码详情
202000用户未启用两步验证
202001两步验证代码错误
202002两步验证 Secret 非法
202003两步验证已达尝试上限
202004用户已启用两步验证,无法重复绑定