JWT token过期自动续期解决方案

JWT

JWT全称JSON Web Token,由三部分组成header(头部,用于描述关于该JWT的最基本的信息,例如其类型以及签名所用的算法等)、payload(载荷,就是存放有效信息的地方,在这一部分中存放过期时间)和signature(签证,签证信息)。

token

token就是后端生成的JWT字符串值,在前后端分离中,token是前端访问后端接口的合法身份、权限的凭证。

token过期刷新方案

1、单点登录
用户登录,后端验证用户成功之后生成两个token,这两个token分别是access_token(访问接口使用的token)、refresh_token(access_token过期后用于刷续期的token,注意设置refresh_token的过期时间需比access_token的过期时间长),后端将用户信息和这两个token存放到redis中并返回给前端。
前端在获取到登录成功返回的两个token之后,将之存放到localStorage本地存储中。
2、接口请求
前端封装统一接口请求函数、token刷新函数,在请求成功之后对返回结果进行校验,如果token过期,则调用token刷新函数请求新的token.
后端在接收到token刷新请求之后通过结合redis中存放的用户信息、token和refresh_token对请求参数进行验证,验证通过之后生成新的token和refresh_token存放到redis中并返回给前端。至此完成token刷新。
3、多请求应对
所谓多请求,就是指在短时间内同时发生多个请求,如果此时token已经过期,那么这些请求都会出现token过期请求失败的情况。
为了避免反复刷新token,需要设置一个刷新token的开关isRefresh,当一个请求出现token过期的时候,这个时候会调用token刷新函数,与此同时关闭开关将isRefresh的值设置为false,避免后续请求去调用token刷新函数。
当发现token过期时,咱们将请求延缓到token刷新之后再重新执行请求,这里采用Promise函数,把每一个token失效的请求都存到一个Promise函数集合里面,当token刷新之后打开开关将isRefresh的值设置为true,然后批量执行Promise函数集合里面的Promise函数,返回请求结果。

### 如何设置或延长 JWT Token过期时间 JWT(JSON Web Token)是一种广泛使用的身份验证机制,但由于其不可变性,一旦签发便无法修改或撤销。因此,处理 JWT 过期问题通常需要引入额外的技术手段。 #### 使用 Refresh Tokens 延长认证生命周期 Refresh Tokens 是一种常见的解决方案,用于在 Access Token 到期后重新获取新的有效令牌。这种方式通过分离短期有效的 Access Token 和长期有效的 Refresh Token 来增强安全性[^1]。Access Token 负责日常的身份验证请求,而 Refresh Token 仅用于安全环境下换取新令牌。 #### Redis 缓存 Token 实现动态管理 另一种方式是利用 Redis 缓存来管理和延长 JWT过期时间。Redis 提供高效的键值存储功能,可以通过设定 TTL(Time To Live)属性控制每个 Token 的有效期。每当用户携带合法的 Token 访问服务端时,都可以触发逻辑更新该 Token 对应的 Redis 键的有效期限[^3]。 以下是基于 Redis 动态调整 JWT 生命周期的一个简单实现: ```python import redis from datetime import timedelta, datetime # 初始化 Redis 客户端 r = redis.Redis(host='localhost', port=6379, db=0) def update_token_expiration(token: str): """ 更新指定 Token 在 Redis 中的过期时间 """ key = f'token:{token}' if r.exists(key): # 如果存在,则更新过期时间 new_expiry_time = datetime.now() + timedelta(minutes=30) r.expireat(key, int(new_expiry_time.timestamp())) return True return False def authenticate_and_update(user_id: str, password: str) -> str: """ 验证用户名密码并生成/更新 Token """ if verify_credentials(user_id, password): # 自定义函数验证凭证 token = generate_jwt(user_id) # 自定义函数生成 JWT r.set(f'token:{token}', user_id, ex=timedelta(minutes=30)) return token raise ValueError('Invalid credentials') def check_token_validity(token: str) -> bool: """ 检查 Token 是否仍然有效 """ return r.exists(f'token:{token}') ``` 上述代码展示了如何结合 Redis 存储和操作 Token 数据,并允许每次成功调用 API 后刷新 Token 的存活周期[^4]。 #### 不依赖外部库的手动续约方案 如果不想借助第三方工具或者框架支持自动续期的功能,也可以手动编写类似的续约流程。例如,在 Java 应用程序中,可以在每次接收到客户端发送过来的有效 Token 请求之后立即重建一个新的带有更晚截止日期的新实例返回给前端应用继续使用直到再次接近结束为止[^5]。 总之,无论是采用 refresh tokens 方法还是依靠内存数据库像 Redis 来辅助完成这项工作都各有优劣需视具体场景需求决定最佳实践路径。
评论 37
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值