SpringSecurity中OAuth2.1/OIDC1.0升级变化明细

spring-oauth-server v3.0.0版本中,我们全部升级了OAuth协议(从OAuth2.0升级到OAuth2.1)并同步增加了对OIDC1.0的支持落地。这些实现的底层依赖SpringSecurity框架的变化,此文将这些细节一一通过对比来讲解。

每一项是一个变化点,依次罗列出之前,之后(v3.0.0)以及说明。

  • spring security oauth组件

spring-security-oauth2 v2.3.x

spring-security-oauth2-authorization-server v1.1.x

Spring Security官方对旧的不再维护支持而推荐升级替换用新的实现,详见 https://andaily.com/blog/?p=20077

  • grant_type变化
  • authorization_code (包括PKCE)
  • password
  • client_credentials
  • implicit
  • refresh_token
  • authorization_code (包括PKCE)
  • client_credentials
  • refresh_token
  • device_code (urn:ietf:params:oauth:grant-type:device_code)
  • jwt-bearer (urn:ietf:params:oauth:grant-type:jwt-bearer)

grant_type的变化看到安全在不断升级,同时为更好的支持物联网提供协议上的支撑。具体说明详见 https://andaily.com/blog/?p=103

  • scope变化
  • read
  • write
  • trust
  • openid
  • profile
  • email
  • address
  • phone

scope的变化按照OIDC协议的规范来实现的,代码中详见 OidcScopes.java

  • MySQL表结构
  • oauth_client_details
  • oauth_client_token
  • oauth_access_token
  • oauth_refresh_token
  • oauth_code
  • oauth2_registered_client
  • oauth2_authorization
  • oauth2_authorization_consent

表设计变化挺大的,主要由于框架的实现重新设计与实现,新的表结构能更好地满足token全生命周期管控(同时带来一定的性能问题,可通过技术手段解决),有更好的配置项扩展能力(通过将各类配置项通过JSON格式数据存储)

  • token配置项
  • access_token_validity -设置token有效时长(默认12小时)
  • refresh_token_validity -设置refresh_token有效时长(默认30天)
  • authorization_code_time_to_live -设置authorization_code有效时长(默认5分钟)
  • access_token_time_to_live -设置access_token有效时长(默认5分钟)
  • access_token_format -设置access_token的格式,有两选项self-contained(自签即JWT格式,默认) reference(兼容旧的,通过UUID生成随机值)
  • device_code_time_to_live -设置device_code有效时长(默认5分钟)
  • reuse_refresh_token -设置是否复用refresh_token值当刷新token后(默认true复用,设置false时每次刷新后将生成新的refresh_token值)
  • refresh_token_time_to_live -设置refresh_token有效时长(默认60分钟)
  • idtoken_signature_algorithm -设置生成id_token使用的签名算法(默认RS256)

新版本与token配置项相关的请查看 TokenSettings.java 类与数据库表oauth2_registered_client 中的字段 token_settings

  • client配置项
  • trusted -是否授权信任; 适用于grant_type=”authorization_code”的情况,当用户登录成功后,若该值为0,则会跳转到让用户Approve的页面让用户同意授权
  • autoapprove -是否自动跳过用户授权步骤
  • client_secret_expires_at -client_secret过期时间,可设置
  • client_authentication_methods -认证请求时传递client_secret支持的方式(如post, basic)
  • post_logout_redirect_uris -退出时的重定向到client的uri地址
  • require_proof_key -是否强制使用PKCE(默认false)
  • require_authorization_consent -授权时是否要求用户进行确认(默认false)
  • token_endpoint_authentication_signing_algorithm -指定jwt-bearer流程中生成id_token时使用的签名算法(常见如RS256, ES256)
  • client_name -可以给client设置一个有业务意义的名称

新版本与client配置项相关的请查看 ClientSettings.java 类与数据库表 oauth2_registered_client 中的字段 client_settings

  • java版本

java 8

java 17+(openJDK)

从JVM层面做安全升级,同时提升性能与稳定性

  • token全生命周期管控API
  • /oauth/token -通过认证生成token
  • /oauth/check_token -检查token状态
  • /oauth/error -响应HTML异常信息
  • /oauth2/token -通过认证生成token
  • /userinfo -获取用户信息,OIDC协议中定义
  • /oauth2/revoke -吊销已签发的token
  • /oauth2/introspect -审查token状态(包括是否存活等)
  • /connect/logout -退出并销毁token,浏览器上调用

新版本的token全生命周期管控完整性更好,也是协议更新版本的优势所在

通过各明细对比,能更清晰理解与把控各项安全细节。

spring-oauth-client v2.0.0发布,OAuth2.1客户端参考实现

spring-oauth-client 发布了v2.0.0版本,全面支持OAuth2.1协议的各类grant_type(如 device_code),对应不久前发布的 sping-oauth-server v3.0.0版本功能。

此版本升级更新的主要内容如下:

  1. 底层安全架构升级:jdk 升级 17 (相比 jdk8 性能与稳定性有大提升), spring6.x, springboot3.x, thymeleaf 替换 servlet/jsp
  2. 增加支持OAuth2.1协议中的 device_code 与 jwt-bearer 两种实现(同时弃用了旧的grant_type,如password),并提供相应的工具类
  3. 构建产物由war换成jar,更便捷
  4. 界面使用说明按OAuth2.1协议进行更新,更友好理解
  5. 日志框架升级,由logback替换旧的log4j

v2.0.0版本链接:https://gitee.com/mkk/spring-oauth-client/tree/2.0.0/

spring-oauth-server v3.0.0 大版本发布,升级到OAuth2.1 & OIDC1.0

在spring-oauth-serverg开源10周来之际,我们发布了全新的大版本v3.0.0,从底层架构到整体的协议支持都做了大范围的升级与更新,更好的满足业务需要与跟上技术演进。

此版本升级更新的主要内容如下:

  1. 底层安全架构升级:jdk升级17(相比jdk8性能与稳定性有大提升), spring6.x, springboot3.x, thymeleaf替换servlet/jsp
  2. 全面升级支持 OAuth2.1协议与 OIDC1.0协议(同时弃用了旧的grant_type, 如 password模式)
  3. 构建包由war换成jar, SQL相应调整
  4. 用spring-security-oauth2-authorization-server升级替换spring-security-oauth2, 详见背景说明
  5. 界面使用说明按OAuth2.1进行友好设计并更新各提示语句
  6. 增加spring-restdocs文档支持, 自动生成API相关文档

v3.0.0 版本链接:https://gitee.com/shengzhao/spring-oauth-server/tree/3.0.0/

oauth2-shiro 2.0.0版本发布,安全大升级

oauth2-shiro v2.0.0版本正式发布,在距上一次发布7年后,更新了大版本,对安全漏洞等问题进行大升级。

该版本主要更新内容:

  1. 升级使用springboot,调整工程结构,打包由war换成jar,使用thymeleaf替换servlet/jsp;spring大版本升级到5.3提升安全性。
  2. JDK由1.7升级到1.8,日志框架使用logback替换log4j(处理掉log4j安全漏洞)。
  3. 升级shiro版本到v1.11.0,解决相应的shiro版本漏洞。
  4. 密码存储算法由MD5替换为SHA-256,并支持盐(salt),让密码存储更安全可靠(通过配置参数authz.store.credentials.alg来控制与向下兼容)。
  5. OAuth token支持使用JWT格式(通过配置参数authz.token.generator.type来控制与向下兼容)。
  6. 对初始的账户密码与client secret使用更加安全的密码策略:包括大小写字母,数字与特殊符号,长度至少10位。

v2.0.0版本链接:https://gitee.com/mkk/oauth2-shiro/tree/2.0.0/

【推荐升级】

spring-oauth-server 2.1.0 发布,增加更多灵活场景

spring-oauth-server在快两年后的2022-05-01更新发布了2.1.0版本,spring-oauth-server是Spring与OAuth2整合示例,并扩展提供更多特性与场景。

此版本主要增加了JWT的支持,具体内容如下:

  1. 升级access_token, refresh_token支持JWT(Json Web Token), 提高性能
  2. 增加灵活性配置参数sos.reuse.refresh-token可实时延长token时效(类似session机制)
  3. 升级spring-security oauth2版本为2.3.8.RELEASE, 增加spring-security-jwt版本1.1.1.RELEASE
  4. 优化:文档目录结构调整,更直观简洁。

v2.1.0版本链接:https://gitee.com/shengzhao/spring-oauth-server/tree/2.1.0

MyOIDC v1.1.2 发布,基于OIDC协议的参考实现

MyOIDC  — 基于OIDC协议的参考实现,根据各类库提供实现参考 。正式版本v1.1.2发布,此版本主要是安全升级,更新内容:

1.为了处理CVE安全漏洞,对以下依赖库进行了升级:

  • spring-boot升级到v2.5.9;
  • spring-security-oauth2升级到v2.3.8.RELEASE
  • guava升级到v31.0-jre

2.增加了banner.txt,更新README.md让使用者更易上手

3.修复已知的各类bug

v1.1.2 tag:https://gitee.com/mkk/MyOIDC/tree/v1.1.2

spring-security-oauth2从v2.4.0.RELEASE开始不推荐使用并迁移

spring-oauth-server最新的版本中使用的spring-security-oauth2版本为v2.3.8.RELEASE;但之后的版本中将不再升级spring-security-oauth2的版本。

这是因为在spring-security-oauth2官方从v2.4.0.RELEASE版本开始将所有类标识为过期的(@Deprecated),并且说明了原因。

* @deprecated See the <a href=”https://github.com/spring-projects/spring-security/wiki/OAuth-2.0-Migration-Guide”>OAuth 2.0 Migration Guide</a> for Spring Security 5.

所有类在IDE中显示为不推荐使用。

在查看迁移的文章 https://github.com/spring-projects/spring-security/wiki/OAuth-2.0-Migration-Guide 中说明有具体原因。

为此,在spring-oauth-server的最新开发版本中(https://gitee.com/shengzhao/spring-oauth-server/tree/2.1.1/)也将去掉spring security oauth2依赖,改用新的Spring Security提供的 spring-security-authorization-server来替换。

尽请期待。

spring-oauth-server v2.1.0增加token存储的配置说明

spring-oauth-server的v2.1.0版本中增加了新的配置属性:

sos.token.store=jwt

该配置项有两个可选值:jwt或jdbc(默认)

jwt – 表示使用jwt作为token的数据格式,性能更高,推荐使用;配置实现详见 JWTTokenStoreConfiguration.java类;

jdbc – 表示使用数据库存储token的数据(包括refresh token),支持之前版本的实现,也是默认选项,对应的配置实现详见 JdbcTokenStoreConfiguration.java

https://gitee.com/shengzhao/spring-oauth-server