spring - 如何在 POST 中发送 ClientId 和 ClientSecret,而不是在带有 ClientCredentialsAccessTokenProvider 的 header 中

标签 spring spring-security spring-boot spring-security-oauth2 spring-cloud

我的批处理必须使用 OAuth2 和授权类型的客户端凭据连接到 Web 服务

代码如下:

    ClientCredentialsResourceDetails resource = new ClientCredentialsResourceDetails();

    resource.setAccessTokenUri(accessTokenUri);
    resource.setClientId(clientId);
    resource.setClientSecret(clientSecret);

    ClientCredentialsAccessTokenProvider provider = new ClientCredentialsAccessTokenProvider();     
    OAuth2AccessToken accessToken = provider.obtainAccessToken(resource, new DefaultAccessTokenRequest());

执行此代码时,它会发出一个请求,其中 grant_type 位于 post 值中,但 clientId 和客户端密码被放入带有经典基本身份验证 header 的 header 中:

    Authorization: Basic bXktY2xpZW50LWlkIDpteS1jbGllbnQtc2VjcmV0

如果我解码字符串 bXktY2xpZW50LWlkIDpteS1jbGllbnQtc2VjcmV0

    decode64(bXktY2xpZW50LWlkIDpteS1jbGllbnQtc2VjcmV0) -> my-client-id:my-client-secret

这通常很好。但是我们必须使用的 Web 服务不支持这一点,我们必须将 client-id 和 client-secret 放在像 grant-type 这样的 post 值中。

有没有办法做到这一点?一种配置如何发送 client-id 和 client-secret 的方法?

迈克尔

最佳答案

ClientCredentialsResourceDetails 类中有一个方法setClientAuthenticationScheme。默认是AuthenticationScheme.header,你可能需要设置成AuthenticationScheme.form

关于spring - 如何在 POST 中发送 ClientId 和 ClientSecret,而不是在带有 ClientCredentialsAccessTokenProvider 的 header 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32047869/

相关文章:

java - Spring security - 具有多个身份验证提供者的记住我身份验证

java - 需要配置Spring Security和Hibernate

spring-boot - 从 CommandLinerunner 获取应用程序上下文

java - Spring Boot 应用程序如何在没有 @Configuration 类的情况下创建 bean

java - 跳过 Spring 中的 CORS 并配置项目以使用 Aptana

spring - Maven 和 Spring = 无法创建应用程序上下文 : Unable to locate Spring NamespaceHandler

Spring Security 不保护根路径

java - QueryDsl 错误。未生成 Q 类

java - Spring Maven + IntelliJ 和 404

java - jackson 不匹配输入异常 : No content to map due to end-of-input