Spring Security版本5.4.0
通常client-id和client-secret是Oauth2提供程序提供的值,它们对于每个客户端都是永久的,可以在配置文件中这样指定
spring:
security:
oauth2:
client:
registration:
google:
client-id: google-client-id
client-secret: google-client-secret
但是在我的情况下,我有固定的client-id,但是每次尝试获取身份验证代码时,都会根据某些参数生成client-secret。在最后一个类中ClientRegistration
,client-secret被定义为字符串值,因此在我的情况下不可能采用此类
我的问题是,是否可以在这种情况下使用Spring Security?如果可以,可以采用/配置什么?
听起来您可能正在执行PKCE。
在这种情况下,您可以将机密留为空白,Spring Security会在/authorize
请求中生成代码质询和验证程序。
从文档:
使用代码交换证明密钥(PKCE)支持公共客户端。如果客户端在不受信任的环境(例如,本机应用程序或基于Web浏览器的应用程序)中运行,因此无法维护其凭据的机密性,则在满足以下条件时将自动使用PKCE:
client-secret
被省略(或为空)
client-authentication-method
设置为"none"
(ClientAuthenticationMethod.NONE
)
如果您要进行自定义操作,则可以考虑将其标准化为PKCE。
但是,如果您不能这样做,那么Spring Security会附带各种挂钩,用于向/authorize
和/token
请求中添加自定义参数。我建议您看一下DefaultOAuth2AuthorizationRequestResolver#setAuthorizationRequestCustomizer
和DefaultAuthorizationCodeTokenResponseClient#setRequestEntityConverter
。
您可以在DSL中注册您的自定义授权请求和令牌请求,如下所示:
http
.oauth2Login((oauth2) -> oauth2
.authorizeEndpoint((authorize) -> authorize
.authorizeRequestResolver(...)
)
.tokenEndpoint((token) -> token
.accessTokenResponseClient(...)
)
);
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句