JWT学习(二)之JWT + Refresh Token 接口规范

JWT + Refresh Token 接口规范

1. 规范概述

1.1 设计目标

  • 使用 JWT 作为 Access Token
  • 使用 Refresh Token 刷新 Access Token
  • Access Token 无状态、短有效期
  • Refresh Token 服务端可控、一次性使用
  • 支持踢人、禁用、审计
  • 符合 OAuth2.0 / OAuth2.1 设计思想

1.2 Token 类型说明

Token 类型 用途 有效期 存储
Access Token (JWT) API 访问鉴权 10~30 分钟 客户端
Refresh Token 刷新 Token 7~30 天 客户端 + 服务端

1.3 签名算法

  • JWT 签名算法:RS256
  • 私钥:仅认证服务
  • 公钥:网关 / 业务服务

2. JWT Claim 规范(强制)

2.1 Access Token Claim 定义

json 复制代码
{
  "iss": "kms-auth",
  "aud": "kms-api",
  "sub": "user_123",
  "jti": "550e8400-e29b-41d4",
  "iat": 1769750000,
  "exp": 1769751800,
  "scope": "user admin"
}
Claim 必填 说明
iss 签发方
aud 接收方
sub 用户 ID
jti Token 唯一标识
iat 签发时间
exp 过期时间
scope 权限范围

⚠️ JWT 中禁止存储任何敏感信息


3. 通用接口规范

3.1 请求头规范

http 复制代码
Content-Type: application/json
Authorization: Bearer <access_token>

3.2 统一响应格式

json 复制代码
{
  "code": 0,
  "message": "success",
  "data": {}
}

3.3 错误码定义

code 含义
0 成功
40001 请求参数错误
40101 未认证
40102 Token 过期
40103 Token 无效
40301 权限不足
50000 系统异常

4. 接口定义(核心)


4.1 获取 Access Token & Refresh Token(登录)

接口描述

  • 用户登录认证
  • 使用 HTTP Basic 校验客户端身份
  • 使用 Form 表单提交参数

接口定义

复制代码
POST /oauth/token

客户端认证方式(强制)

http 复制代码
Authorization: Basic base64(client_id:client_secret)

请求格式

http 复制代码
Content-Type: application/x-www-form-urlencoded

请求参数(password 模式)

复制代码
grant_type=password
&username=zhangsan
&password=123456
&scope=user
参数说明
参数 必填 说明
grant_type 固定为 password
username 登录账号
password 登录密码
scope 权限范围

响应示例(JSON)

json 复制代码
{
  "code": 0,
  "message": "success",
  "data": {
    "access_token": "eyJhbGciOiJSUzI1NiIs...",
    "token_type": "Bearer",
    "expires_in": 1800,
    "refresh_token": "f8a7c9b0-xxxx",
    "scope": "user"
  }
}

4.2 使用 Refresh Token 刷新 Access Token

接口描述

  • Access Token 过期后调用
  • Refresh Token 仅可使用一次

接口定义

复制代码
POST /oauth/token

客户端认证(必须)

http 复制代码
Authorization: Basic base64(client_id:client_secret)

请求格式

http 复制代码
Content-Type: application/x-www-form-urlencoded

请求参数(refresh_token 模式)

复制代码
grant_type=refresh_token
&refresh_token=f8a7c9b0-xxxx

响应示例

json 复制代码
{
  "code": 0,
  "data": {
    "access_token": "new-jwt-token",
    "token_type": "Bearer",
    "expires_in": 1800,
    "refresh_token": "new-refresh-token"
  }
}

强制安全规则

  • ✅ Refresh Token 一次性使用
  • ✅ 返回 新的 Refresh Token
  • ❌ 旧 Refresh Token 立即作废
  • ❌ Refresh Token 不允许并发使用

4.3 用户登出(Token 主动失效)

接口描述

  • 主动退出登录
  • 支持踢人

接口定义

复制代码
POST /oauth/logout

请求头

http 复制代码
Authorization: Bearer <access_token>

服务端处理逻辑

  • 删除 Refresh Token
  • 将 Access Token 的 jti 加入黑名单(Redis)

响应示例

json 复制代码
{
  "code": 0,
  "message": "logout success"
}

4.4 Token 校验接口(可选)

接口定义

复制代码
POST /oauth/introspect

请求参数

json 复制代码
{
  "token": "access_token"
}

响应示例

json 复制代码
{
  "active": true,
  "sub": "user_123",
  "exp": 1769751800,
  "scope": "user"
}

5. Refresh Token 存储规范(生产级)

5.1 Redis 存储示例

复制代码
key: refresh_token:{hash}
{
  "userId": "user_123",
  "clientId": "kms-web",
  "expireAt": 1772352000,
  "status": "ACTIVE"
}

安全要求

  • 仅存 Hash
  • 设置 TTL
  • 支持状态禁用

6. 安全控制(必须)

6.1 Access Token 校验

  • 验签(RS256)
  • 校验 exp
  • 校验 iss / aud
  • 校验 jti 黑名单

6.2 客户端安全

  • client_secret 不允许下发前端
  • HTTPS 强制
  • Token 禁止出现在 URL

6.3 Refresh Token 风控

  • 一次性使用
  • 绑定 client_id
  • 可选:IP / UA 校验

7. 常见异常示例

Token 过期

json 复制代码
{
  "code": 40102,
  "message": "access token expired"
}

Refresh Token 无效

json 复制代码
{
  "code": 40103,
  "message": "refresh token invalid"
}

8. 一句话总结

Access Token 使用 JWT 实现无状态鉴权;

Refresh Token 通过服务端控制保证安全;

Basic + Form 保证客户端认证与参数安全传输。


相关推荐
啊哈哈1213820 小时前
SQL学习笔记7:综合查询与高级技巧全解析 + LeetCode实战
笔记·sql·学习
GocNeverGiveUp20 小时前
大模型学习1
学习
我命由我1234520 小时前
Photoshop - Photoshop 工具栏(69)前景色和背景色
学习·ui·职场和发展·求职招聘·职场发展·学习方法·photoshop
强子感冒了21 小时前
JSON和XML学习笔记
xml·学习·json
我命由我1234521 小时前
Photoshop - Photoshop 工具栏(70)以快速蒙版/标准模式编辑
学习·ui·职场和发展·求职招聘·职场发展·学习方法·photoshop
蒸蒸yyyyzwd21 小时前
后端学习笔记计网
笔记·学习
red_redemption21 小时前
自由学习记录(120)
学习
{Hello World}1 天前
MySQL学习----------相关库表操作
数据库·学习·mysql
啊阿狸不会拉杆1 天前
《计算机视觉:模型、学习和推理》第 6 章-视觉学习和推理
人工智能·学习·算法·机器学习·计算机视觉·生成模型·判别模型
古译汉书1 天前
【IoT死磕系列】Day 3:学习HTTP!实战:STM32手写GET请求获取天气实战(附源码+八股文)
数据结构·stm32·物联网·网络协议·学习·算法·http