JWT token封装以及自动刷新方案建议

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JWT token封装以及自动刷新方案建议相关的知识,希望对你有一定的参考价值。

参考技术A 什么是JWT

pom.xml

JWTUtil.java

用户登录操作

在前后分离场景下,越来越多的项目使用jwt token作为接口的安全机制,但存在jwt过期后,用户无法直接感知,假如在用户操作页面期间,突然提示登录,则体验很不友好,所以就有了token自动刷新需求;

方案:前端控制检测token,无感知刷新

用户登录成功的时候,一次性给他两个Token,分别为AccessToken和RefreshToken

AccessToken有效期较短,比如1天或者5天,用于正常请求

RefreshToken有效期可以设置长一些,例如10天、20天,作为刷新AccessToken的凭证

刷新方案:当AccessToken即将过期的时候,例如提前30分钟,客户端利用RefreshToken请求指定的API获取新的AccessToken并更新本地存储中的AccessToken

核心逻辑

1、登录成功后,jwt生成AccessToken; UUID生成RefreshToken并存储在服务端redis中,设置过期时间

2、接口返回3个字段AccessToken/RefreshToken/访问令牌过期时间戳

3、由于RefreshToken存储在服务端redis中,假如这个RefreshToken也过期,则提示重新登录;

老王的疑问:RefreshToken有效期那么长,和直接将AccessToken的有效期延长有什么区别

答:RefreshToken不像AccessToken那样在大多数请求中都被使用,主要是本地检测accessToken快过期的时候才使用,

一般本地存储的时候,也不叫refreshToken,前端可以取个别名,混淆代码让攻击者不能直接识别这个就是刷新令牌

缺点:前端每次请求需要判断token距离过期时间

优点:后端压力小,代码逻辑改动不大

刷新token方法未实现。

ASP.NET Core 自动刷新JWT Token

为了安全性考虑,我们可以设置JWT Token较短的过期时间,但是这样会导致客户端频繁地跳到登录界面,用户体验不好。

正常解决办法是增加refresh_token,客户端使用refresh_token去主动刷新JWT Token。

这里介绍一种变通的方式,自动刷新JWT Token

原理

我们读取每个请求的Authorization头,获得当前请求的JWT Token。

检查当前token的过期时间,如果在30分钟以内,那么我们就生成一个具有新过期时间的JWT Token,并通过X-Refresh-Token头返回。

客户端检查到X-Refresh-Token头,就将保存的JWT Token替换掉,下次发送请求就是用最新的token了。

实现

创建一个Middleware,它的作用是检查JWT Token过期时间并生成新token返回:

public async Task InvokeAsync(HttpContext context)

    JwtSecurityToken token = null;
    string authorization = context.Request.Headers["Authorization"];

    if (!string.IsNullOrEmpty(authorization)
 && authorization.StartsWith("Bearer "))
        token = new JwtSecurityTokenHandler().
ReadJwtToken(authorization.Substring("Bearer ".Length));

    //刷新Token
    if (token != null 
&& token.ValidTo > DateTime.UtcNow 
&& token.ValidTo.AddMinutes(-30) <= DateTime.UtcNow)
    
        context.Response.Headers.Add("X-Refresh-Token",
 await RefreshTokenAsync(token));
    

    await _next(context);

结论

当然,推荐大家尽量使用refresh_token的方式,毕竟这样安全性会更高一些。

想了解更多内容,请关注我的个人公众号”My IO“

以上是关于JWT token封装以及自动刷新方案建议的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET Core 自动刷新JWT Token

ASP.NET Core 自动刷新JWT Token #yyds干货盘点#

无感刷新token

springboot+jwt刷新token

JWT生成token及过期处理方案

Android携带token登陆验证与刷新token