Skip to content

8.6 Token 使用说明 ​

概述

本文档面向 API 对接方:如何获取令牌、如何携带、如何刷新、如何撤销。令牌为 JWT HS256 双令牌(access 2h + refresh 7d),唯一使用下划线命名的响应。

获取令牌(POST /api/login,公开) ​

sh
curl -X POST http://127.0.0.1:8000/api/login \
  -H "Content-Type: application/json" \
  -d '{"username":"admin","password":"123456","code":"618618","key":"<captcha-key>"}'
json
{
  "code": 0, "ok": true, "msg": "操作成功",
  "data": {
    "access_token":  "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.…",
    "refresh_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.…",
    "expires_in": 7200,
    "token_type": "Bearer"
  }
}

命名例外

登录/令牌接口返回 access_token/refresh_token/expires_in/token_type(OAuth2 惯例下划线命名)——这是全系统唯一例外,其余接口出入参一律驼峰。

携带令牌调用业务接口 ​

sh
curl http://127.0.0.1:8000/api/user/page?pageNo=1&pageSize=10 \
  -H "Authorization: Bearer <access_token>"

兼容细节:Bearer 前缀大小写不敏感、可无前缀直接传 token;个别场景支持查询参数 ?token=(URL 直传)。

刷新令牌(POST /api/oauth2/token,公开) ​

access 过期(收到 code=401)时用 refresh_token 轮换新令牌对:

sh
curl -X POST http://127.0.0.1:8000/api/oauth2/token \
  -H "Content-Type: application/json" \
  -d '{"grant_type":"refresh_token","refresh_token":"<refresh_token>"}'
json
{ "data": { "access_token": "…", "refresh_token": "…", "expires_in": 7200, "token_type": "Bearer" } }

刷新语义:

text
* 旧 refresh 入黑名单(轮换)——旧 refresh_token 立即作废,必须存新值
* 旧 access 自然过期(不主动拉黑)
* 返回同登录格式四字段
* 兼容密码模式:grant_type=password 或无 refresh_token → 复用登录逻辑

撤销与校验 ​

text
GET  /api/logout                     登出(当前 access jti 拉黑)
DELETE /api/oauth2/remove/:token     撤销指定令牌(登录可用;解析 jti 入黑名单)
GET  /api/oauth2/check/token        校验令牌有效性(JWT 中间件通过即有效)

对接方实现要点 ​

text
1. 存储:access 与 refresh 分开存(内存/localStorage);refresh 泄露=账号风险
2. 请求:全部业务请求带 Authorization: Bearer <access>
3. 401 处理:单飞刷新(并发 401 只触发一次 refresh,其余等结果);
   refresh 失败(1008/401)→ 清令牌 → 跳登录
4. 刷新成功:立即用新令牌对覆盖旧值(旧 refresh 已作废)
5. 时钟偏移:以 expires_in 倒计时提前刷新(如过期前 60s),减少 401
6. 登出:调 /api/logout 后清本地——不调的话令牌有效期内仍可用

令牌状态速查 ​

状态表现处理
有效业务正常—
access 过期code=401refresh 轮换
refresh 过期/已轮换code=1 或 1008重新登录
已拉黑(登出/强退)code=401重新登录(强退的 refresh 也拉黑,无法复活)
算法/签名无效code=401检查是否跨环境混用 jwt.secret

安全建议 ​

  • HTTPS 传输(令牌明文等价于会话)
  • refresh_token 泄露面最小化(不入 URL、不入日志——后端已脱敏)
  • 客户端不持久化 access(内存优先);persist refresh 的场景加密存储
  • 多端登录场景用在线用户模块管理(forceLogout 双令牌拉黑)

小蚂蚁云团队 · 提供技术支持