两步验证(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_secret | string | 两步验证的 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_secret | string | 两步验证的 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 | 用户已启用两步验证,无法重复绑定 |