直接调用 /api/auth/** 接口。access 存 sessionStorage(关页丢),refresh 走 HttpOnly cookie(JS 读不到,XSS 拿不走)。
未登录
Swagger UI ↗
输入手机号或邮箱 → 选登录方式: 验证码登录(拿验证码 → 提交即可登录,账号不存在则自动注册)或 密码登录(已设置过密码的老账号,不会自动注册)。
测试环境验证码只在服务端 log 打印,看应用 stdout 拿明文。
账号不存在 / 未设过密码 / 密码错误统一提示"账号或密码错误"(防枚举),首次使用请改用验证码登录。
需要 Authorization: Bearer <accessToken>。刷新用 refresh token 换新 access(轮换:旧 refresh 立即撤销)。
GET /api/auth/me 响应:
(未调用)
GET /api/auth/streaming-me 响应(持续追加):
(未调用)
登出只撤销 refresh token,access 短期有效,等过期即可。
已登录设备调 POST /api/auth/login-handoff-ticket 换一次性短 TTL 的 ticket,
拼进跳转链接 GET /api/auth/login-handoff?ticket=...。这个 GET 请求本身就是兑换请求——
浏览器直接打开链接即可完成种 cookie + 302 跳转,不需要任何前端 JS 配合。
签发结果:
(未调用)
把复制到的链接粘到新标签页(或另一台设备的浏览器)直接打开,应立即种下 rt/ct cookie 并跳到指定页面(新标签页是独立的匿名会话,不会覆盖本页当前登录的账号)。 ticket 一次性,兑换或过期后需重新签发。
公开资料(其他用户可看)。三个字段都是覆盖式更新:空串 = 清空。
走 PUT /api/auth/me,已登录才可调用。Bearer 头短路 CSRF,无需 X-CSRF-Token。
已登录用户可用验证码重置密码。选择要重置的通道(邮箱/手机) → 发码 → 输入新密码 → 重置。
绑定新邮箱或手机号。如已绑定过,需要用旧通道验证后才能换绑新的。