spring-oauth-serverg v3.0.1正式发布,此版本主要增加免密码登录的Passkey功能。
此版本升级更新的主要内容如下:
- 增加Passkeys(WebAuthn) 支持, 实现浏览器无密码登录(使用设备认证)。使用说明详见 others/passkeys-webauthn-user-guide.md。
- MySQL encoding use utf8mb4,支持各类表情符号。
- 优化:添加对 jwks.json 文件必要的安全说明。
spring-oauth-serverg v3.0.1正式发布,此版本主要增加免密码登录的Passkey功能。
此版本升级更新的主要内容如下:
在spring-oauth-server v3.0.0版本中,我们全部升级了OAuth协议(从OAuth2.0升级到OAuth2.1)并同步增加了对OIDC1.0的支持落地。这些实现的底层依赖SpringSecurity框架的变化,此文将这些细节一一通过对比来讲解。
每一项是一个变化点,依次罗列出之前,之后(v3.0.0)以及说明。
spring-security-oauth2 v2.3.x
spring-security-oauth2-authorization-server v1.1.x
Spring Security官方对旧的不再维护支持而推荐升级替换用新的实现,详见 https://andaily.com/blog/?p=20077
grant_type的变化看到安全在不断升级,同时为更好的支持物联网提供协议上的支撑。具体说明详见 https://andaily.com/blog/?p=103
表设计变化挺大的,主要由于框架的实现重新设计与实现,新的表结构能更好地满足token全生命周期管控(同时带来一定的性能问题,可通过技术手段解决),有更好的配置项扩展能力(通过将各类配置项通过JSON格式数据存储)
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_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 8
java 17+(openJDK)
从JVM层面做安全升级,同时提升性能与稳定性
/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协议的各类grant_type(如 device_code),对应不久前发布的 sping-oauth-server v3.0.0版本功能。
此版本升级更新的主要内容如下:
v2.0.0版本链接:https://gitee.com/mkk/spring-oauth-client/tree/2.0.0/
在spring-oauth-serverg开源10周来之际,我们发布了全新的大版本v3.0.0,从底层架构到整体的协议支持都做了大范围的升级与更新,更好的满足业务需要与跟上技术演进。
此版本升级更新的主要内容如下:
v3.0.0 版本链接:https://gitee.com/shengzhao/spring-oauth-server/tree/3.0.0/
MyOIDC — 基于OIDC协议的参考实现,根据各类库提供实现参考 。正式版本v1.1.2发布,此版本主要是安全升级,更新内容:
1.为了处理CVE安全漏洞,对以下依赖库进行了升级:
2.增加了banner.txt,更新README.md让使用者更易上手
3.修复已知的各类bug
v1.1.2 tag:https://gitee.com/mkk/MyOIDC/tree/v1.1.2
OAuth2中默认使用 Bearer Tokens (一般用UUID值)作为token的数据格式,但也支持升级使用JSON Web Token(JWT)来作为token的数据格式。
下面以 spring-oauth-server 升级使用JWT来说明
重点在于提供一个 JwtTokenStore的配置类,详细可参见 MyOIDC 工程中的配置:https://gitee.com/mkk/MyOIDC/blob/master/myoidc-server/src/main/java/myoidc/server/config/OAuth2ServerConfiguration.java
需要注意的是底层使用的算法,可以是RSA也可以对称加密的HMAC等,具体可查看 JwtAccessTokenConverter.java 类。
对应的工程中需要增加 spring-security-jwt 库的依赖(如果是Maven工程)。
JWKS全称为 JSON Web Key Set,是指多个JWK组合在一起的一种格式(详见 https://tools.ietf.org/html/draft-ietf-jose-json-web-key-41#section-5 );
JWK全称是JSON Web Key,其标准协议链接:https://tools.ietf.org/html/draft-ietf-jose-json-web-key-41
JWK在OIDC中的主要作用是为JWT(id_token)提供加密密钥,用于加密/解密或签名/验签,是JSON格式的数据。
综上所说,掌握了如何生成JWK,再按照JWKS协议的要求组合起来即可。根据使用不同的加密算法,各种算法的JWK展示内容会有些区别,一个使用RSA算法的JWK格式的数据如下,使用jose4j生成:
{
"kty": "RSA",
"kid": "myoidc-keyid",
"use": "sig",
"alg": "RS256",
"n": "xMNL1jDatbHWGDH_H9GZbb2R4Ck2ga-lfE6wJnno_MfqJibSqkiLTZ7P06woJFxzB0WDu2PBe-ptRNoJhEnkzL8c1mgbGOdPVCsaaDm-POGZ3gnWGcyzyuJ9s9km41Rlan3TuuC3HIniY4bmyQAZ-SLwrFk7Bfa91ui4F9S5RvM",
"e": "AQAB",
"d": "q73XDM65p8vgll_VUn2NUPcdQ65VUB7y76xzHjJchX8tRj2utUj6pjaPKi_jHdG_6UHouIBa2oEE_QrfMaOZ2wA6LgYPXT_a296LKoOtKKRUlgob_leHxn0FJxLOXtEHgMqDgtMQ1-eFipsFgriip94dmcLEWW3YVK_y5JwJrnE",
"p": "7OqN19bEbMb9cr9zA98QQq9LOgvQfq5-nOvzwMsubqMosHxViRnivFz2-3LpusK7u2XEG5EljqUxZrf4lgeVmw",
"q": "1Jy9ksoLuQ5tuc4docgLaXQWqf3iaTm3iC07AA4v9jHzvnkewWFS_PUPPcra4475Dew-y7oIENaRBMijrrWViQ",
"dp": "HBEdhLh4xLo-RF3R7l96uauyqcnEhX1-mnCJjAmGEq1ZoK7aI0fhyJbq25cdgXaYbvb7aJilbmS7mYOp-3wiiQ",
"dq": "NRMLn-EgHAomCgQSEZjGgISiQ71FD8-AqVXhLJpeDq9ZkWra6ptJBCyIqXxCOBwwv_EBnAnMiaeGfBM6CRr7QQ",
"qi": "VCdAeu4h25X_kM69Netc3SKPo5P-1VjeSHz0Ko0QuSMF0INc6H2yi7hZgZuYANVaTF1Ipf6lWfHBLpuRGh3lXw"
}
JWK数据的格式具体可参见 https://tools.ietf.org/html/draft-ietf-jose-json-web-key-41#section-4
主要属性:kty(Key类型),use(两个可选值:sig or enc),alg(具体的算法),kid(Key的唯一标识id)
有了JWK数据,只需要按照JWKS的格式组装成对应的JSON数据即可,以上面的JWK组装的JWKS数据如下:
{
"keys": [
{
"p": "7OqN19bEbMb9cr9zA98QQq9LOgvQfq5-nOvzwMsubqMosHxViRnivFz2-3LpusK7u2XEG5EljqUxZrf4lgeVmw",
"kty": "RSA",
"q": "1Jy9ksoLuQ5tuc4docgLaXQWqf3iaTm3iC07AA4v9jHzvnkewWFS_PUPPcra4475Dew-y7oIENaRBMijrrWViQ",
"d": "q73XDM65p8vgll_VUn2NUPcdQ65VUB7y76xzHjJchX8tRj2utUj6pjaPKi_jHdG_6UHouIBa2oEE_QrfMaOZ2wA6LgYPXT_a296LKoOtKKRUlgob_leHxn0FJxLOXtEHgMqDgtMQ1-eFipsFgriip94dmcLEWW3YVK_y5JwJrnE",
"e": "AQAB",
"use": "sig",
"kid": "myoidc-keyid",
"qi": "VCdAeu4h25X_kM69Netc3SKPo5P-1VjeSHz0Ko0QuSMF0INc6H2yi7hZgZuYANVaTF1Ipf6lWfHBLpuRGh3lXw",
"dp": "HBEdhLh4xLo-RF3R7l96uauyqcnEhX1-mnCJjAmGEq1ZoK7aI0fhyJbq25cdgXaYbvb7aJilbmS7mYOp-3wiiQ",
"alg": "RS256",
"dq": "NRMLn-EgHAomCgQSEZjGgISiQ71FD8-AqVXhLJpeDq9ZkWra6ptJBCyIqXxCOBwwv_EBnAnMiaeGfBM6CRr7QQ",
"n": "xMNL1jDatbHWGDH_H9GZbb2R4Ck2ga-lfE6wJnno_MfqJibSqkiLTZ7P06woJFxzB0WDu2PBe-ptRNoJhEnkzL8c1mgbGOdPVCsaaDm-POGZ3gnWGcyzyuJ9s9km41Rlan3TuuC3HIniY4bmyQAZ-SLwrFk7Bfa91ui4F9S5RvM"
}
]
}
以上的JWK,JWKS的示例的完整代码(JAVA实现)可在此查看 https://gitee.com/mkk/MyOIDC/blob/master/myoidc-server/src/test/java/myoidc/server/infrastructure/JWKSTest.java。代码中还包括除RSA外,ECC,OCT的示例实现。
JWK本身未定义一种新的加密算法或变种,只是定义一种JSON格式的数据展示(更符合互联网传输),其底层实现依旧依赖PKI体系的技术,如x509,公钥/私钥体系。在其协议介绍中能更好地体现出来。
如果是使用非JAVA语言,也可以使用对应的PKI技术生成JWK,如openssl;
一个使用JDK自带的 keytool 工具生成的示例如下:
keytool -genkeypair -alias oidc-demo -validity 180 -keyalg RSA -keypass oidc-demo -keystore oidc-demo.jks -storepass oidc-demo
命令输入后依次填写DN的各类信息,即可生成 oidc-demo.jks文件,密码为 oidc-demo,文件中有私钥公钥等信息。
若需要导出为 x509格式数据,使用keytool命令:
keytool -exportcert -keystore oidc-demo.jks -rfc -file oidc-demo.cer -alias oidc-demo
输入密码后生成的 oidc-demo.cer文件为x509格式。
以下对OIDC主要的术语进行说明,并与OAuth2作相关对比。
access_token后,可调用此接口获取EU的详细信息.id_token中获取,主要包括认证信息与授权信息,可根据实际扩展OIDC协议中抽象了一个主要的操作步骤与流程示意图,如下:
下面以AWS提供的OIDC服务来举例说明。 假设你现在有一个应用A想集成使用AWS的OIDC服务,在实现OIDC之前需要先做几件事
OIDC流程在此示例中的关系图如下:
结束。
详细完整的使用请访问 MyOIDC: https://gitee.com/mkk/MyOIDC。