Spring security Spring安全、OAUTH2、动态客户端机密

Spring security Spring安全、OAUTH2、动态客户端机密,spring-security,oauth,Spring Security,Oauth,Spring安全版本5.4.0 通常,客户机id和客户机机密是Oauth2提供程序提供的值,它们对于每个客户机都是永久性的,可以在配置文件中这样指定 spring: security: oauth2: client: registration: google: client-id: google-client-id client-secret: google-client-secret

Spring安全版本5.4.0

通常,客户机id和客户机机密是Oauth2提供程序提供的值,它们对于每个客户机都是永久性的,可以在配置文件中这样指定

spring:
  security:
    oauth2:
      client:
        registration:
          google:
            client-id: google-client-id
            client-secret: google-client-secret
但在我的例子中,我有固定的客户机id,但每次尝试获取身份验证代码时,都会根据一些参数生成客户机机密。 在最后一个类
ClientRegistration
中,客户机机密被定义为一个字符串值,因此在我的例子中不可能采用这个类


我的问题是,在这种情况下是否可以使用Spring Security,如果可以,可以采用/配置什么?

听起来您可能正在这样做

在这种情况下,Spring Security将生成代码质询和验证程序,作为
/authorize
请求的一部分

从文档中:

使用代码交换验证密钥(PKCE)支持公共客户端。如果客户端在不受信任的环境中运行(例如,本机应用程序或基于web浏览器的应用程序),因此无法维护其凭据的机密性,则在满足以下条件时,将自动使用PKCE:

客户端机密
被省略(或为空)

客户端身份验证方法
设置为
“无”
ClientAuthenticationMethod.none

如果您正在做定制的事情,那么您可以考虑对PKCE标准化。

但是,如果您不能做到这一点,那么Spring Security会为和提供各种挂钩。我建议看一下
DefaultOAuth2AuthorizationRequestResolver#setAuthorizationRequestCustomizer
DefaultAuthorizationCodeTokenResponseClient#setRequestEntityConverter

您可以在DSL中注册自定义授权请求和令牌请求,如下所示:

http
.oauth2Login((oauth2)->oauth2
.authorizeEndpoint((授权)->授权
.authorizeRequestResolver(…)
)
.tokenEndpoint((令牌)->token
.accessTokenResponseClient(…)
)
);