双token三验证

16

系统设计之 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      │         │
│              └───────────┬───────────────┘         │
│                          │                         │
│                          ▼                         │
│              ┌───────────────────────────┐         │
│              │         访问资源           │         │
│              └───────────────────────────┘         │
│                          │                          │
│                          │       无效/过期          │
│                          │                          │
└──────────────────────────┼──────────────────────────┘
                           ▼
                ┌───────────────────┐
                │    需要重新登录    │
                └───────────────────┘

微信截图_20240420164256.png