为了安全性考虑,我们可以设置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);

}

更多相关文章

  1. Android(安卓)时间、日期处理 DateUtils、SystemClock、DateForm
  2. Android(安卓)为【apk】文件签名,增加修改系统时间等权限
  3. android 自定义时间控件
  4. android:打开Eclipse之后android项目都报错怎么解决
  5. Android获取当前时间
  6. android源码浅析--notification
  7. Android执行shell命令
  8. Android(安卓)demo倒计时原理(CountDownTimer原理)
  9. android 自定义时间控件

随机推荐

  1. 使用python抓取csdn博客访问量并保存在sq
  2. 编译安装mysql-server5.6.32手记
  3. 将非常简单的Expression >转换为SQL wher
  4. Mysql基础篇(笔记)
  5. 入门 --ubuntu下面mysql数据库安装以及相
  6. SQLite3使用总结备忘(多线程/WAL/锁等)
  7. MySQL:讨人喜欢的 MySQL replace into 用
  8. [新开一贴]php5.4 连接Sqlserver2008 的
  9. mysqldump的几个主要选项探究
  10. MYSQL学习笔记(三)