SpringOAuth2相关内容

标签: Springboot 分类: Java 创建时间:2020-09-03 01:35:52 更新时间:2023-10-20 11:23:26

关于Spring OAuth2还有很多的内容需要理清楚,弄明白,于是就又写了一篇文章。我的OAuth2使用的代码主要是微服务权限终极解决方案,Spring Cloud Gateway + Oauth2 实现统一认证和鉴权!

1.验证过期时间

Spring OAuth2有如下默认的几个请求方法,可以通过以下的方法进行检查和刷新token

1
2
3
4
5
6
7
8
9
10
11
12
13
14
## 获取access_token请求(/oauth/token)
## 请求所需参数:client_id、client_secret、grant_type、username、password
http://localhost/oauth/token?client_id=demoClientId&client_secret=demoClientSecret&grant_type=password&username=demoUser&password=50575tyL86xp29O380t1


## 检查头肯是否有效请求(/oauth/check_token)
## 请求所需参数:token
http://localhost/oauth/check_token?token=f57ce129-2d4d-4bd7-1111-f31ccc69d4d1

## 刷新token请求(/oauth/token)
## 请求所需参数:grant_type、refresh_token、client_id、client_secret
## 其中grant_type为固定值:grant_type=refresh_token
http://localhost/oauth/token?grant_type=refresh_token&refresh_token=fbde81ee-f419-42b1-1234-9191f1f95be9&client_id=demoClientId&client_secret=demoClientSecret

当然也可以解码access_token自行判断

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
String realToken = access_token.replace("Bearer ", "");

// 解析access_token信息
JWSObject jwsObject = JWSObject.parse(realToken);
String userStr = jwsObject.getPayload().toString();
JSONObject access_user=JSONObject.parseObject(userStr);

Date now = new Date();
long nowMillisecond=now.getTime();
long exp=access_user.getLong("exp")*1000;
// SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//24小时制
// Date old=new Date(exp);
// System.out.println(simpleDateFormat.format(old));
// 如果当前时间已经过期了,重新申请令牌
if(nowMillisecond>=exp){
JSONObject authJSON = getSystemAccessToken(openId);
if(authJSON==null){
throw new Exception("getConfig返回值为空");
}else {
String new_token=authJSON.getString("access_token");
modelMap.put("token",new_token);
userInfo.putAll(authJSON); // 存入授权信息
}
}

2.自定义JWT失效时间

一开始,我想知道Spring OAuth2默认的失效时间,但是很难找到,上来都是自定义tokenservice进行自定义失效时间的判断。

当然,最后还是找到了,oAuth2.0中access_token默认有效时长为12个小时,refresh_token默认时长为30天。当然可以通过下面两种方法实现自定义。
(1) 在AuthorizationServerConfigurerAdapter,重写一个TokenServices,实现自定义默认时长。(对应了参考文章4)
(2) 提供自定义 TokenServices方法。(对应参考文章2)

其实两者本质都是一样的,只是注入方式不同罢了。

参考文章:
1.看完这篇文章,你如果还不知道怎么设置Oauth2令牌过期时间算我输 (这篇文章讲了一个ApiBoot OAuth的东西,估计是自己写的一个类库,暂时没有仔细研究)
2.spring-security-oauth2 修改默认token失效时间 (这篇文章提供了自定义TokenServices方法)
3.JWT过期刷新问题,实现十五天免登陆
4.Spring Security oAuth2.0设置access_token和refresh_token的有效时长 (这篇文章告诉了我默认的有效时长,也提供了如何自定义有效时长的方法)

3.续期

被动刷新

(1) 客户端携带 token 访问资源服务器资源
(2) 资源服务器拦截 token 去认证服务器 check_token
(3) 认证服务器返回 token 过期错误,资源服务器包装错误信息返回给客户端
(4) 客户端根据返回错误信息(响应码),直接调用认证服务器 refresh_token
(5) 认证服务器返回新的 token 给客户端, 然后再次发起 资源调用
被动请求的缺点是,用户当次请求会失败(返回token失败),对一些业务连贯的操作不是很友好

主动刷新

(1) 客户端存在计算逻辑,计算下发token 有效期
(2) 若token要过期之前,主动发起刷新

主动请求的缺点是,客户端占用部分计算资源来处理 token 失效问题

参考文章:
1.聊聊 OAuth 2.0 的 Token 续期处理 (这里提供了两种方式进行续期的方式,一种就是主动续期,一种就是被动续期,两者各有优缺点)
2.双token刷新、续期,access_token和refresh_token实效如何设置
3.SpringBoot 整合 spring security oauth2 jwt完整示例 附源码 (增加JwtTokenEnhancer类,主要定义了token过期时间以及加密方式)
4.Spring OAuth2 token自动续签方案

4.检查token是否过期

在很多的文章中,有一个请求就是oauth/check_token,说是可以检查token是否过期,但是时间上,在我刚开始进行测试的时候,出现了401错误。

解决方法就是开启token验证

1
2
3
4
5
@Override
public void configure(AuthorizationServerSecurityConfigurer security) throws Exception {
security.allowFormAuthenticationForClients(); // 允许表单验证
security.checkTokenAccess("permitAll()");// 允许检查token时候有效
}

检查通过会返回如下的信息:

参考文章:
1./oauth/check_token 401 (这里提到了check_token默认是不允许访问的)
2.Spring Security Oauth2 授权服务开发 (这里其实有check_token的用法,但是没有说明在那里定义的)
4.聊聊 OAuth 2.0 的 Token 续期处理 (这里其实是自己实现了一个check_token的方法)
小额赞助
本人提供免费与付费咨询服务,感谢您的支持!赞助请发邮件通知,方便公布您的善意!
**光 3.01 元
Sun 3.00 元
bibichuan 3.00 元
微信公众号
广告位
诚心邀请广大金主爸爸洽谈合作
每日一省
isNaN 和 Number.isNaN 函数的区别?

1.函数 isNaN 接收参数后,会尝试将这个参数转换为数值,任何不能被转换为数值的的值都会返回 true,因此非数字值传入也会返回 true ,会影响 NaN 的判断。

2.函数 Number.isNaN 会首先判断传入参数是否为数字,如果是数字再继续判断是否为 NaN ,不会进行数据类型的转换,这种方法对于 NaN 的判断更为准确。

每日二省
为什么0.1+0.2 ! == 0.3,如何让其相等?

一个直接的解决方法就是设置一个误差范围,通常称为“机器精度”。对JavaScript来说,这个值通常为2-52,在ES6中,提供了Number.EPSILON属性,而它的值就是2-52,只要判断0.1+0.2-0.3是否小于Number.EPSILON,如果小于,就可以判断为0.1+0.2 ===0.3。

每日三省
== 操作符的强制类型转换规则?

1.首先会判断两者类型是否**相同,**相同的话就比较两者的大小。

2.类型不相同的话,就会进行类型转换。

3.会先判断是否在对比 null 和 undefined,是的话就会返回 true。

4.判断两者类型是否为 string 和 number,是的话就会将字符串转换为 number。

5.判断其中一方是否为 boolean,是的话就会把 boolean 转为 number 再进行判断。

6.判断其中一方是否为 object 且另一方为 string、number 或者 symbol,是的话就会把 object 转为原始类型再进行判断。

每日英语
Happiness is time precipitation, smile is the lonely sad.
幸福是年华的沉淀,微笑是寂寞的悲伤。