v1auth 上下文
资料
显示名、用户名与用户名可用性检查。
资料端点只服务会话:username 与 display_name 归 auth 所有;性别、生日、时区等扩展档案归 account,见 account 的 /me。两边各自维护自己的字段,不互相代写。
端点
| 方法 | 路径 | 说明 | 提权 |
|---|---|---|---|
PATCH | /v1/auth/profile | 修改显示名 | 无 |
PUT | /v1/auth/username | 修改用户名 | max_age=300 |
GET | /v1/auth/username/available | 检查用户名是否可用 | 无 |
PATCH /profile
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
display_name | string | ✅ | 展示名 |
{ "success": true, "username": "alice", "display_name": "Alice Chen" }显示名不承载任何权限,改错了也能改回来,因此不要求提权。仅在值真的发生变化时写入安全记录。
PUT /username
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
username | string | ✅ | 新的登录标识 |
| 状态 | 含义 |
|---|---|
200 | 修改成功 |
409 | 用户名已被占用 |
400 | 形态不合法 |
只要求 max_age,不要求 AAL2
用户名是别人找到并登录这个账号的依据,因此必须证明「此刻是本人」——这正是 max_age 回答的问题。
若再叠加 AAL2,只有密码一种登录方式的用户将永远改不了用户名,那是功能缺失而不是安全加固。
GET /username/available
| 查询参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
value | string | ✅ | 待检查的用户名 |
{ "success": true, "available": false, "reason": "taken" }reason 固定出现:invalid_format 表示形态不合法,taken 表示已被占用,null 表示可用。客户端据此给出不同的输入提示,而不是只弹一句「不可用」。
为什么这个端点要求登录
做成公开接口,「这个用户名能不能用」就等于「这个用户名存不存在」,用户名空间会被枚举成一张通讯录。 绑定到会话后,枚举成本被抬高到「先注册或先登录」,配合限流才真正拦得住脚本。
相关
- 扩展档案字段:account /me
- 提权怎么走:会话提权