OAuth2中 access_token,refresh_token的各类配置与使用场景FAQ

过去几年的OAuth2经历与使用,总结一下,记录有关 access_token, refresh_token的各类配置与场景适应,到此以自问自答的形式把这些琐碎的点总结下来。

说明:以下问答中的截图或表等信息以 spring-oauth-server 中配置为参考。

> 问:可以设置永不过期的 refresh_token吗?

答:可以,需要按以下步骤操作:首先在client_details定义中不设置 refresh_token_validity 字段值(即默认null),其次在配置OAuth2的DefaultTokenServices时将refreshTokenValiditySeconds属性值配置为0或小于0(默认为30天,若想修改为其他默认值也在此配置),关键代码看下图

OAuth2中 access_token,refresh_token的各类配置与使用场景FAQ_第1张图片

> 问:可以设置永不过期的 access_token吗?

答:可以,但不推荐使用(因为永不过期意味着除手动清除外无安全性可言);若需要按以下步骤操作:首先在client_details定义中不设置 access_token_validity字段值(即默认null),其次在配置OAuth2的DefaultTokenServices时将accessTokenValiditySeconds属性值配置为0或小于0(默认为12小时,若想修改为其他默认值也在此配置),关键代码看下图

OAuth2中 access_token,refresh_token的各类配置与使用场景FAQ_第2张图片

正在上传…重新上传取消正在上传…重新上传取消正在上传…重新上传取消正在上传…重新上传取消

> 问:refresh_token功能可以禁用吗?

答:可以,首先要求client_details的grant_type不支持 refresh_token,即authorized_grant_types字段中无 refresh_token,其次在配置OAuth2的DefaultTokenServices时将supportRefreshToken配置为false即可,关键代码看下图

OAuth2中 access_token,refresh_token的各类配置与使用场景FAQ_第3张图片

正在上传…重新上传取消正在上传…重新上传取消正在上传…重新上传取消正在上传…重新上传取消

> 问:默认的 access_token有效时间是多少?默认的 refresh_token有效时间是多少?在哪看

答:默认access_token有效时间为12小时,默认refresh_token有效时间为30天,这两默认值在OAuth2的DefaultTokenServices中定义的,如下图:

OAuth2中 access_token,refresh_token的各类配置与使用场景FAQ_第4张图片

正在上传…重新上传取消正在上传…重新上传取消正在上传…重新上传取消正在上传…重新上传取消

若想改变默认值,只需要在定义client_details是修改字段access_token_validity (access_token有效时间)与 refresh_token_validity (refresh_token有效时间),单位为:秒

> 问:可否在每次调用 refresh token操作时重新生成一个 refresh_token值?若可以如何做(刷新token只能生成一次)

答:可以支持此功能,具体为在配置OAuth2的DefaultTokenServices时将reuseRefreshToken属性配置为fasle即可(默认true),关键代码看下图

OAuth2中 access_token,refresh_token的各类配置与使用场景FAQ_第5张图片

正在上传…重新上传取消正在上传…重新上传取消正在上传…重新上传取消正在上传…重新上传取消

> 问:能否在生成access_token后加自己扩展的代码逻辑?若能如何做

答:可以加自己的扩展逻辑。首先需要写一个类实现接口 TokenEnhancer.java ,实现方法 enhance方法,一示例如下:

OAuth2中 access_token,refresh_token的各类配置与使用场景FAQ_第6张图片

其次在配置 OAuth2的DefaultTokenServices时增加tokenEnhancer属性配置,关联扩展实现的类即可,关键代码如下

OAuth2中 access_token,refresh_token的各类配置与使用场景FAQ_第7张图片

实际上Spring Security OAuth2中实现JWT从而支持OIDC流程就是扩展TokenEnhancer.java来实现的(有一个实现类 JwtAccessTokenConverter.java)

> 问:生成access_token值是一UUID值吧?能否不使用UUID值,想扩展如何办?

答:确实生成的access_token是一UUID值,若要扩展不使用UUID,需要这样做:首先写一个子类继承DefaultTokenServices.java,其次将DefaultTokenServices.java的源代码复制到扩展的子类中,并修改createAccessToken方法与createRefreshToken方法中的代码(如此做是因为两方法定义的private的),关键代码如下

OAuth2中 access_token,refresh_token的各类配置与使用场景FAQ_第8张图片

正在上传…重新上传取消正在上传…重新上传取消正在上传…重新上传取消正在上传…重新上传取消

另一种办法是通过扩展TokenEnhancer.java 来实现(详细见上一问答)

> 问:如何提高 access_token, refresh_token的性能,默认存储在数据库中在高并发大数据时数据库连接会成为性能瓶颈的

答:在大数据高并发环境时,建议使用Redis,将access_token, refresh_token存储在Redis中实现,具体在配置OAuth2的TokenStore时使用子类 RedisTokenStore(默认使用的子类为JdbcTokenStore),更多信息请查看 在spring-oauth-server中将AccessToken存入Redis的配置 | MONKEYK.博客

更高的性能推荐使用JWT格式的token,详见 spring-oauth-server 2.1.0 发布,增加更多灵活场景 | MONKEYK.博客。

> 问:OAuth2.0之后有新的版本协议?若有在使用上有哪些变化呢?

答:有,OAuth2.1版本协议,状态与特征详见 OAuth 2.1的状态与主要特征 | MONKEYK.博客。

你可能感兴趣的:(java,spring,后端)