当前位置: 代码网 > it编程>编程语言>Java > SpringBoot中基于JWT的单token授权和续期方案步骤详解

SpringBoot中基于JWT的单token授权和续期方案步骤详解

2024年09月23日 Java 我要评论
在前后端分离架构中,用户登录成功后,后端颁发jwt token至前端,该token被安全存储于localstorage。随后,每次请求均自动携带此token于请求头中,以验证用户身份。后端设有过滤器,

在前后端分离架构中,用户登录成功后,后端颁发jwt token至前端,该token被安全存储于localstorage。随后,每次请求均自动携带此token于请求头中,以验证用户身份。后端设有过滤器,拦截并校验token有效性,一旦发现过期则引导用户重新登录。

简单的说明token实现身份认证的步骤:

  • 用户登录成功服务端返回token

  • 之后每次用户请求都携带token,在authorization header中。

  • 后端服务取出token进行decode,判断有效期及失效策略。

  • 返回对应的成功失败

鉴于jwt包含用户信息且需保障安全,其过期时间通常设置较短。然而,这易导致用户频繁登录,尤其是在处理复杂表单时(比如在线考试),因耗时过长而遇token过期,引发不必要的登录中断和数据丢失,严重影响用户体验。如何在用户无感知状态下实现token自动续期的策略,减少频繁登录需求,确保表单数据不丢失?

解决token过期的续期问题可以有很多种不同的方案,这里举一些比较有代表性的例子,一种是单token续期,一种是双token续期。

1 单token续期

用户认证与token生成:用户成功登录后,服务端生成一个包含必要信息的jwt(json web token),并返回给客户端。此token作为后续请求的身份验证依据。

请求携带token:在后续的每一次api请求中,客户端都需在http请求的authorization头部字段中携带此jwt,以便服务端验证用户的身份和权限。

token管理策略:服务端设定了token的失效时间(或失效次数)以及一个重新登录的期限阈值。每当用户登录时,服务端会记录当前的登录时间,以便后续验证使用。

token验证与响应

  • 当用户携带token发起请求时,服务端首先根据token的失效时间和重新登录期限进行验证。
  • 若token有效,则正常处理请求并返回所需资源。
  • 若token已失效但仍在重新登录期限内,服务端返回特定的错误代码提示token已过期,同时提示客户端进行token刷新。

token刷新机制

  • 客户端接收到token过期错误代码后,自动调用refresh token接口,向服务端请求刷新token。
  • 服务端验证请求的有效性(如检查是否仍在重新登录期限内等),通过后生成新的有效token并返回给客户端。

使用刷新后的token:客户端在收到新的token后,自动替换掉旧的token,并在后续的请求中携带此新token继续访问服务。

强制重新登录

  • 若服务端判断当前token的使用时长已超过了设定的重新登录期限,则不再允许通过refresh token接口刷新token。
  • 此时,服务端会返回强制重新登录的错误代码给客户端,客户端接收到此代码后,应引导用户跳转至登录页面进行重新登录。

比如:

  • 将 token 过期时间设置为15分钟;
  • 前端发起请求,后端验证 token 是否过期;如果过期,前端发起刷新token请求,后端为前端返回一个新的token;
  • 前端用新的token发起请求,请求成功;
  • 如果要实现每隔72小时,必须重新登录,后端需要记录每次用户的登录时间;用户每次请求时,检查用户最后一次登录日期,如超过72小时,则拒绝刷新token的请求,请求失败,跳转到登录页面。
  • 后端还可以记录刷新token的次数,比如最多刷新50次,如果达到50次,则不再允许刷新,需要用户重新授权。

到此这篇关于springboot中基于jwt的单token授权和续期方案的文章就介绍到这了,更多相关springboot jwt token授权内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com