双token三验证
系统设计之 Token 验证
双 Token 三验证
acess_token 的刷新
为了保证安全性防止 Token 用户登录成功后,得到两个 Token,一个 access_token(访问令牌 5分钟有效),一个refresh_token(刷新令牌 24小时有效)。正常访问的时候使用access_token 令牌,过期后基于 refresh_token 刷新 acess_token。直到 refresh_token 过期。需要重新登录。
refresh_token 的刷新
为了可以让后端可以基于风控来让 token 失效,需要将 refresh_token 设计成只能续签一次。
将 refresh_token 存储在 Redis 等中间件中,等续签 access_token 的时候,验证 refresh_token 是否过期,是否是使用过,如果没有问题则重新生成 acess_token 和 refresh_token
这样即可在token异常时(异地登录),使其失效
┌───────────────────────┐
│ 用户 │
└─────────┬─────────────┘
│
│ 登录
│
▼
┌───────────────────────┐
│ 登录系统 │
└─────────┬─────────────┘
│
│ ┌───────────────────┐
└──>│ 生成access_token │
│ (5分钟有效) │
│ │
│ 生成refresh_token │
│ (24小时有效) │
└───────────┬───────┘
│
▼
┌───────────────────┐
│ Redis │
│ 存储refresh_token │
└───────────────────┘
│
▼
┌───────────────────────────────────────────────────┐
│ 业务系统 │
│ │
│ ┌──────────────────────────────────────────────┐ │
│ │ 使用access_token访问资源 │ │
│ └───────────┬───────────────────────────────────┘ │
│ │ │
│ │ 有效 │
│ │ │
│ ▼ │
│ ┌───────────────────────────────────────────────┐ │
│ │ 访问资源 │ │
│ └───────────────────────────────────────────────┘ │
│ │ │
│ │ 过期 │
│ │ │
│ ┌──────────────────────┐ │
│ │ │ │
│ │ 检查refresh_token │ │
│ │ 是否有效 │ │
│ │ │ │
│ └───────────┬──────────┘ │
│ │ │
│ │ 有效 │
│ │ │
│ ┌───────────────────────────┐ │
│ │ 生成新的access_token和 │ │
│ │ refresh_token │ │
│ └───────────┬───────────────┘ │
│ │ │
│ ▼ │
│ ┌───────────────────────────┐ │
│ │ 访问资源 │ │
│ └───────────────────────────┘ │
│ │ │
│ │ 无效/过期 │
│ │ │
└──────────────────────────┼──────────────────────────┘
▼
┌───────────────────┐
│ 需要重新登录 │
└───────────────────┘