在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变化
- 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全生命周期管控完整性更好,也是协议更新版本的优势所在
通过各明细对比,能更清晰理解与把控各项安全细节。