Spring oauth2.0 刷新token后设置原token5分钟内继续可用

2023-11-01

默认情况下刷新token后原token会立马不可用。但是在某些情况下我们需要刷新token后原token在一定时间内继续可用(例如微信的刷新token)。

通过查看DefaultTokenServices中的刷新token方法refreshAccessToken可以看到生成新的token后会调用removeAccessTokenUsingRefreshToken方法,此方法默认会删除存储的相关token信息

private void removeAccessTokenUsingRefreshToken(String refreshToken) {
		byte[] key = serializeKey(REFRESH_TO_ACCESS + refreshToken);
		List<Object> results = null;
		RedisConnection conn = getConnection();
		try {
			conn.openPipeline();
			conn.get(key);
			conn.del(key);
			results = conn.closePipeline();
		} finally {
			conn.close();
		}
		if (results == null) {
			return;
		}
		byte[] bytes = (byte[]) results.get(0);
		String accessToken = deserializeString(bytes);
		if (accessToken != null) {
			removeAccessToken(accessToken);
		}
	}

所以就需要重写该方法设置不立即删除

 

首先需要自定义tokenStore

public class OAuth2AuthorizationConfiguration extends AuthorizationServerConfigurerAdapter {
    @Override
	public void configure(AuthorizationServerEndpointsConfigurer endpoints) {
		endpoints.accessTokenConverter(new FrameworkAccessTokenConverter());
		endpoints.authorizationCodeServices(meiceAuthorizationCodeService)
				.tokenEnhancer(jwtAccessTokenConverter())
				.reuseRefreshTokens(false)
                // 使用自定义tokenStore管理tongken
				.tokenStore(meiceTokenStore)
				.userDetailsService(meiceUserDetailsService)
				.authenticationManager(authenticationManager)
				.setClientDetailsService(meiceClientDetailsService);
		endpoints.allowedTokenEndpointRequestMethods(HttpMethod.GET, HttpMethod.POST);
		endpoints.exceptionTranslator(new MeiceWebResponseExceptionTranslator());
		//使用自定义granter以返回refresh_token.(默认granter不返回)
		endpoints.tokenGranter(new CompositeTokenGranter(getMeiceTokenGranters()));
	}
}
//自定义tokenStore(其他代码参考org.springframework.security.oauth2.provider.token.store.redis.RedisTokenStore)
public class IRedisTokenStore implements TokenStore {
    @Override
	public void removeAccessTokenUsingRefreshToken(OAuth2RefreshToken refreshToken) {
		removeAccessTokenUsingRefreshToken(refreshToken.getValue());
	}

	private void removeAccessTokenUsingRefreshToken(String refreshToken) {
		String token = (String) this.redisTemplate.opsForValue().get(REFRESH_TO_ACCESS + refreshToken);

		if (token != null) {
			//设置刷新后5分钟内继续可用
			redisTemplate.expire(ACCESS + token, 300, TimeUnit.SECONDS);
		}
	}
}

至此Token将在刷新后5分钟过期删除.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring oauth2.0 刷新token后设置原token5分钟内继续可用 的相关文章

随机推荐

  • 垂直同步

    vblank时间 显示器显示一帧的时间 显卡或芯片输出的图像数据写在后缓存里 屏幕读取前缓存的图像数据并显示 后缓存数据写入完毕后 前后缓存进行交换 如果前缓存的图片写入速度与屏幕读取图像的刷新率不匹配会发生画面撕裂 解决办法 垂直同步 当
  • JAVA中那些令人眼花缭乱的锁

    一 开局一张图带你了解java相关的锁 二 乐观锁和悲观锁 1 悲观锁 悲观锁对应于生活中悲观的人 悲观的人总是想着事情往坏的方向发展 举个生活中的例子 假设厕所只有一个坑位了 悲观锁上厕所会第一时间把门反锁上 这样其他人上厕所只能在门外等
  • mysql 优化杂记

    慢日志分析 SELECT user id AS userId charm AS num FROM db charm WHERE user id NOT IN ORDER BY num DESC userId LIMIT 性能分析 not i
  • Python 爬虫逆向

    Python 爬虫逆向是指使用 Python 语言来编写爬虫程序 用于爬取网站的信息 爬虫逆向一般指的是通过分析网站的网页代码和加载流程 来确定网站信息获取的方式 并使用爬虫程序来模拟这种方式 从而获取网站的信息 爬虫逆向的主要目的是通过自
  • 为什么spark读取本地的json文件会自动去hdfs上去找?读取不到本地的文件

    问题描述 遇到的问题如上图所示 我在spark中读取的json文件明明是集群本地的文件 可是他偏偏就自作聪明去了hdfs上面去找我的文件 那肯定会报错啊 我hdfs上怎么可能有这个文件嘛 原因 我在spark中的运行环境配置了yarn关联
  • 协调器是如何获取终端的IEEE地址并自动对其分配网络短地址呢

    协调器是如何获取终端的IEEE地址并自动对其分配网络短地址呢 字号 订阅 协调器是如何获取终端的IEEE地址并自动对其分配网络短地址呢 猜想如下 终端上电后稳定后就开始寻找周围是否存在网络 向周围发射广播 该广播内容包含自己的身份信息 即M
  • Koa2框架中使用bcrypt实现密码加密

    bcrypt是一个用于密码哈希的库 它使用了单向哈希函数 因此即使在数据库中存储了哈希后的密码 也不容易还原出原始密码 下面是在Koa 2中使用bcrypt的基本步骤 使用npm npm install bcrypt 使用yarn yarn
  • 手把手教你mysql基本操作

    MySQL的基本操作 首先我们要知道怎么打开Mysql客户端 打开开始界面 这两个都是Mysql的客户端 随便打开哪个都可以 如果设置了密码的就输入自己的密码 没有设置密码的则不需要输入 直接就可以进行操作 输入密码正确后界面如下 接下来我
  • java 简述类的封装性、继承性、多态性

    一 什么是封装性 继承性 多态性 封装性 通俗说就是一个盒子 多个对象 功能 组件等装在一个盒子里 内部具体是什么不知道 用到它时 使用特定方法或功能去调用它 即声明一个变量 其属性值是private 不能给其变量直接赋值 但可以通过方法构
  • 利用尾插法建立单链表

    PTA 5 3本题目要求利用尾插法建立单链表 输入格式 输入数据为若干正整数 最后以 1表示结尾 1不算在序列内 不要处理 所有数据之间用空格分隔 输入样例 1 2 3 4 5 6 7 8 9 1 输出样例 1 2 3 4 5 6 7 8
  • ❤️UNITY实战进阶-三维AABB包围盒详解-6

    前言 碰撞检测问题在虚拟现实 计算机辅助设计与制造 游戏 机器人等方面都有着广泛的应用 而包围盒算法是进行碰撞检测的重要方法之一 而常见的包围盒有 AABB包围盒 Axis aligned bounding box 包围球 Sphere O
  • 小程序创建公共js获取接口数据,全局调用

    新建一个js文件 let app getApp function getImageurl return new Promise function resolve reject wx request url 接口地址 method get d
  • STM32通过esp8266连接WiFi接入MQTT服务器

    上文我们讲到如何搭建本地MQTT服务器http t csdn cn aHNcO 现在介绍如何通过stm32连接MQTT 一 首先我们初始化esp8266这里我们使用的是USART4与其通信代码如下 void UART4 Init uint3
  • 计算机网络应用层协议部分学习

    计算机网络学习第二章 应用层协议部分 应用层 协议原理 研发网络应用程序的核心是写出能够运行在不同的端系统和通过网络彼此通信的程序 例如 在Web应用程序中 有两个互相通信的不同的程序 一个是运行在用户主机 桌面机 膝上机 PDA 蜂窝电话
  • PCL分割:Conditional Euclidean Clustering官方历程,在自己配置环境上调错

    本人环境 VS2015 PCL1 8 1 1 首先遇到遇到了 无法解析的外部符号 提示和normal estimation等错误 解决办法 打开项目属性页 gt C C gt 预处理器 添加 PCL NO PRECOMPILE 2 erro
  • postman(二)——全局变量&环境变量

    一 全局变量 1 1 例如 token 1 作用范围 针对postman中所有使用该变量的请求 作用 方便维护 举例 有一个系统 含有100个接口 所有的接口服务器地址 或者某一个参数都是固定的值 那么把这个值设置全局变量接口中调用 这样接
  • python安装cv2

    pip install opencv python
  • [开发过程]<RTOS>关于RT-Thread

    以前一直折腾FreeRTOS 没时间折腾RT Thread 虽然暂时对RT Thread学的不深 但是从学习难度和社区支持来看 相信多年后RT Thread会成为主流 大概是因为很多RT Thread的中文资料吧 入门还要先学FreeRTO
  • matlab工作区显示的是什么,matlab工作区介绍

    Workspace 工作区窗口 Command History 指令历史记录窗口 Current Directory 当前目录选择窗口 主要内容 Matlab简介 数组和矩阵 Matlab绘图 Matlab Workspace 工作区窗口
  • Spring oauth2.0 刷新token后设置原token5分钟内继续可用

    默认情况下刷新token后原token会立马不可用 但是在某些情况下我们需要刷新token后原token在一定时间内继续可用 例如微信的刷新token 通过查看DefaultTokenServices中的刷新token方法refreshAc