token失效机制

token和刷新机制

token机制就是在登录成功后返回一个token,并缓存起来,之后每个请求头里带上token,后端验证不通过返回401,前端就直接跳转到登录页。这样就能防止直接访问某个链接就能跳到登录页的尴尬局面。

token刷新机制就是在使用的时候使用某个机制使得这个token不过期,不会跳转到登录页。而没有使用的时候token会过期,他隔得太久了再调接口就是401,就会跳到登录页。

两种token刷新机制

第一种(后端提供刷新接口)

客户端服务端
---发送username & password--->
<---返回accesstoken & refreshtoken---
---访问接口携带accesstoken--->
<---返回信息/401---
---accesstoken过期访问刷新接口携带refreshtoken--->
<---返回新的accesstoken/401---
---访问接口携带新的accesstoken--->
<---返回信息/401---

这种情况下 refreshtoken可以设置的时间长一点,而accesstoken设置的时间短一点,我们固定一个用户活跃周期;

活跃周期 = token周期 * 2 ;

  1. eg:活跃周期(at);token周期(et);accesstoken(5 min);refreshtoken(1 day);

  2. 用户在15:00登录,返回token,et[15:00-15:05];at[15:00-15:10];

  3. 如果用户在15:06调用接口,携带accesstoken会返回401过期,此时在活跃周期范围内,则调用refreshtoken刷新接口,返回新的accesstoken;

  4. 此时:et[15:06-15:11],at[15:06-15:16];

  5. 如果用户在15:17分调用接口携带accesstoken会返回401过期,此时不再活跃周期内,则跳转到登录页;

第二种(靠前端cookie实现)

客户端服务端
---发送username & password--->
<---返回accesstoken---
cookie存储设置过期时间
---访问接口携带accesstoken--->
<---返回信息/401--->
调用成功,覆盖延长cookie过期时间--->

这种情况后端accesstoken可以设置的时间长一点;
前端将token存在cookie中,维护一个过期时间,每次调用接口成功后就覆盖延长这个过期时间,不调用接口的时候自然会超时了;

### 解决408状态码导致的Token失效问题 当遇到HTTP 408请求超时错误时,这通常意味着客户端未能在服务器准备等待的时间内发送请求。对于基于Token的身份验证系统而言,处理这种情况的关键在于确保系统的健壮性和用户体验的良好维护。 为了应对由408状态码引发的Token失效情况,可以采取以下措施: 1. **自动刷新机制** 实现一个后台服务来定期检查已发出Token的有效期,并在其接近过期前主动向授权服务器申请新的访问令牌。这种方式能够有效防止因网络延迟或其他原因造成的短暂连接中断影响到用户的正常使用体验[^1]。 2. **重试逻辑设计** 当接收到408响应时,在应用程序层面实现合理的重试策略非常重要。具体来说就是在捕获到此类异常之后尝试重新发起相同的API调用直到成功为止或者是达到预设的最大次数限制。需要注意的是应该加入指数退避算法以减少短时间内频繁失败带来的负载压力。 3. **优化前端交互流程** 前端应用应当具备良好的反馈提示功能,告知用户当前操作可能由于网络状况不佳而受到影响;同时提供简单易懂的操作指南帮助他们解决问题。例如显示“正在加载...”消息并附带进度条让用户了解大致耗时范围内的正常行为模式之外的情况说明。 4. **日志记录与监控报警设置** 利用BigQuery这样的工具可以帮助管理员更好地管理和分析长时间跨度的应用程序运行数据。通过依赖其默认行为修剪超过45天的日志文件[C Rely on BigQuery’s default behavior to prune application logs older than 45 days.],保持存储成本可控的同时也便于后续排查问题根源所在[^2]。 5. **安全撤销管理** 针对那些确实已经无法继续使用的Token实例,建议采用UUID作为唯一标识符仅保存必要的元数据信息以便追踪和必要时候的安全撤销操作。这样既减少了数据库负担又提高了安全性[^3]。 ```python import uuid from datetime import datetime, timedelta def generate_token(): """Generate a new token with an associated UUID.""" token_id = str(uuid.uuid4()) issue_time = int(datetime.now().timestamp()) # iat: "Issued at" time in Unix time expire_time = issue_time + (60 * 60) # Token expires after one hour return { 'id': token_id, 'issued_at': issue_time, 'expires_in': expire_time } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值