【SpringSecurity+OAuth2.0】探寻Invalid access token与Access token expired

前言

不说废话,直接抛问题:

jym你们在用OAuth2.0的时候有没有遇到如下问题:

token过期时,抛出的InvalidTokenException,msg为:Invalid access token。

背景

团队的一个同事,在做账号互踢的需求时,采用了如下方案:

重写DefaultTokenServices的createAccessToken方法

这样的话,第一次登录的页面在发起后端请求时,因token不存在,则抛出异常,来实现账号互踢的需求。 话术要求:"您的账号已在其他地方登录,请确认并重新登录"。

因为针对无效token和token过期,有不同的处理逻辑及提示话术,所以要区分两个异常。

那接下来,同事遇到的问题是如何在异常中判断两个不同的异常。

倒退法,读源码

oauth2.0的代码高度封装,导致好多逻辑固定,不太适应个性化需求。

根据自己的诉求和目标,找到oauth2.0针对token校验的部分:

通过源码,我们留意到是有token是否有效和有效期的两个校验判断的,可以根据msg进行区分,那希望的就是如下逻辑:

我加上之后进行调试,但是遇到的个大坑: 抛出Access token expired异常的逻辑永远走不到。

我们的token存储使用的是RedisTokenStore模式

经过调试发现,如下获取token时,取出来的为null

那是redis里不存在token了,是不是失效了?追去看存储token的逻辑:

如上图,redis存储token时,有效期使用的是token的有效期。怪不得走不到Access token expired异常,原来是token过期时,redis也过期了。

解决该问题的方法,针对RedisTokenStore的storeAccessToken进行重写,使得token存储的redis有效期为token有效期的2倍:

修改完成后再调试,问题解决。

相关推荐
间彧13 小时前
什么是Region多副本容灾
后端
爱敲代码的北13 小时前
WPF容器控件布局与应用学习笔记
后端
爱敲代码的北13 小时前
XAML语法与静态资源应用
后端
清空mega13 小时前
从零开始搭建 flask 博客实验(5)
后端·python·flask
爱敲代码的北13 小时前
UniformGrid 均匀网格布局学习笔记
后端
大模型教程13 小时前
给AI装个“超级大脑”!5分钟带你搞懂RAG,原来这么简单!
程序员·llm·agent
一只叫煤球的猫13 小时前
从1996到2025——细说Java锁的30年进化史
java·后端·性能优化
大模型教程14 小时前
RAG基础知识到高级实现:宝藏级开源指南,手把手教你搭建检索增强生成系统
程序员·llm·agent
AI大模型14 小时前
告别新手级RAG!一文掌握专业级后检索优化:重排
程序员·llm·agent
喵个咪14 小时前
开箱即用的GO后台管理系统 Kratos Admin - 数据脱敏和隐私保护
后端·go·protobuf