首页 > 其他分享 >jwt 滑动过期方案

jwt 滑动过期方案

时间:2022-10-17 10:23:23浏览次数:36  
标签:string 过期 jwtKeyConfig jwt new var 滑动 options

  网上大多实现jwt滑动过期的方案要结合Redis,或者返回俩个token,我这里介绍一个稍微简单点的方案,由于 jwt的总的有效时间是 expires 加上 ClockSkew,

那么我们就在这个ClockSkwe(滑动过期时间)上做做文章

我们首先创建个配置类

 public class JwtKeyConfig
    {
        /// <summary>
        /// 秘钥
        /// </summary>
        public string SecurityKey { get; set; }

        /// <summary>
        /// 签发人
        /// </summary>
        public string Issuer { get; set; }

        /// <summary>
        /// 接收人
        /// </summary>
        public string Audience { get; set; }

        /// <summary>
        /// 过期时间  分钟
        /// </summary>
        public int Expire { get; set; }

        /// <summary>
        /// 缓冲过期时间 分钟
        /// </summary>
        public int ClockSkew { get; set; }
    }

  //添加jwt验证
            services.AddAuthentication(options =>
                {
                    options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
                    options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
                })
                .AddJwtBearer(options =>
                {
                    options.Challenge = JwtBearerDefaults.AuthenticationScheme;
                    options.RequireHttpsMetadata = false;

                    if (!string.IsNullOrEmpty(jwtKeyConfig.Audience))
                        options.Audience = jwtKeyConfig.Audience;

                    options.TokenValidationParameters = new TokenValidationParameters
                    {
                        ValidateIssuer = true,
                        ValidateAudience = true,
                        ValidateLifetime = true,
                        ValidateIssuerSigningKey = true,
                        ValidIssuer = jwtKeyConfig.Issuer,
                        //缓冲过期时间,总的有效时间等于这个时间加上过期时间
                        ClockSkew = TimeSpan.FromMinutes(jwtKeyConfig.ClockSkew),
                        IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtKeyConfig.SecurityKey))
                    };
                    if (null != func)
                        options.Events = new JwtBearerEvents
                        {
                            OnMessageReceived = (context) => { return func.Invoke(context); }
                        };
                });

生成Toekn

  private string CreateToken(Claim[] claims)
        {
            var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_jwtKeyConfig.SecurityKey));
            var credentials = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
            var token = new JwtSecurityToken(
                _jwtKeyConfig.Issuer,
                _jwtKeyConfig.Audience,
                claims,
          //重点是这里 expires: DateTime.Now.AddMinutes(_jwtKeyConfig.Expire), signingCredentials: credentials); return $"Bearer {new JwtSecurityTokenHandler().WriteToken(token)}"; }

这样,假如我们的配置类似这样

{
    "SecurityKey": "123",
    "Issuer": "123",
    "Audience": "123",
    "Expire": 120,
    "ClockSkew": 30
}

那么其实生成的Token总的有效时间是 150分钟,也是是2个半小时, 那么我们在前端俩个小时以后再次请求Token的时候 , 判断一下,然后给用户在返回头中重新生成一个Toekn,前端获取到返回头中有对应的key值,获取到新的token,更新他们本地的token。

判断方法我们写到过滤器中

  public async Task OnResourceExecutionAsync(ResourceExecutingContext context, ResourceExecutionDelegate next)
        {
            if (context.HttpContext.Request.Headers.TryGetValue("Authorization", out var authHeader))
            {
                var token = authHeader.ToString().Split(' ')[1];
                var jwtToken = new JwtSecurityTokenHandler().ReadJwtToken(token);
                var jwtPayload = jwtToken.Payload; //获取payload中的数据 

                if (jwtPayload.Exp != null)
                {
                    var expTime = jwtPayload.Exp.Value;
                    var now = DateTime.Now.ToTimestamp();
                    //如果Token已过期,重新生成Token放在返回头中返回
                    //Token过期时间为设置的过期时间加缓冲过期时间,相当于在缓冲过期时间段内进行请求,将返回一个新的Token
                    if (now > expTime)
                    {
                        var claims = jwtPayload.Claims as List<Claim>;
                        var userId = claims.FirstOrDefault(x => x.Type == ClaimTypes.NameIdentifier)?.Value ?? string.Empty;
                        var userName = claims.FirstOrDefault(x => x.Type == ClaimTypes.Name)?.Value ?? string.Empty;
                        var refreshToken = await _tokenService.CreateTokenAsync(userId, userName);
                        context.HttpContext.Response.Headers.Add("Set-Authorization", refreshToken);
                    }
                }
            }

            await next();
        }

 

标签:string,过期,jwtKeyConfig,jwt,new,var,滑动,options
From: https://www.cnblogs.com/mchuang/p/16798198.html

相关文章

  • 【Django-rest-framework框架】 第12回 simpleui 集成监控大屏与restframework-jwt执
    目录1.后台管理simplui的介绍和使用1.后台管理simplui的介绍和使用1.djangoadmin自带了权限控制,但是是前后端混合的,我们可以二次开发,如开发出公司内部的自动化运行,自......
  • 解决Office宏因数字签名过期而被禁用的问题
    各路厂商开发的Office宏一般只会签署一年的数字签名,若数字签名过期,每次新建文档就都会弹出一行黄色条提示宏已被禁用,无论用不用宏都会很厌烦:在此,本文提出几种解决方案。......
  • JWT的理解
    JWTJWT(JSONWEBTOKEN)说白了也就是一种token罢了,但是它由于不用任何其他包含状态的信息,无状态的jwt轻量,也符合restful的风格。最最最简单的JWT原理JWT分为三部分从上......
  • emqx启用JWT令牌认证(包含hmac-based和public-key)
    emqx连接启用jwt令牌认证jwt令牌概述JWT即JSONWebTokens是一种开放的,用于在两方之间安全地表示声明的行业标准的方法(RFC7519)。组成令牌的形式xxx.yyy.zzze......
  • uniapp-vue3-ts实现 微信小程序-视频上下滑动
    公司需求,后端被迫学习...临时记录一下后续完善暂时不会组件式开发,只能采用选项式了<template><viewstyle="color:white;"><viewclass="swiper">......
  • OAuth,Token和JWT
    什么是OAuth?也就是说OAuth是一个开放标准,提供了一种简单和标准的安全授权方法,允许用户无需将某个网站的用户名密码提供给第三方应用就可以让该第三方应用访问该用户在......
  • leetcode必备算法:聊聊滑动窗口
    前言我们刷leetcode的时候,经常会遇到滑动窗口类型题目。滑动窗口问题非常经典,也很有技巧性,一般大厂也喜欢问。今天跟大家一起来学习滑动窗口的套路,文章如果有不正确的地方,......
  • 11.22 访问日志不记录静态文件 11.23 访问日志切割 11.24 静态元素过期时间
    11.22访问日志不记录静态文件网站大多元素为静态文件,如图片、css、js等,这些元素可以不用记录,否则会使日志文件过于庞大,占用较多的磁盘空间。编辑虚拟主机配置文件[root......
  • jwt 身份认证
    jsonwebtoken:把json对象生成token格式express-jwt:把token对象翻译成json对象 1、安装jsonwebtoken  npmi jsonwebtoken 2、安装express-jwt npmi expres......
  • token机制详解,JWT的使用
    cookie,session、token介绍参考文章:https://www.cnblogs.com/liuqingzheng/p/8990027.htmlcookie:存储在用户端的一-小段文本,用于服务器识别用户的一种技术。cookie是......