如何在 POST 中发送 ClientId 和 ClientSecret,而不是在带有 ClientCredentialsAccessTokenProvider 的标头中发送

Posted

技术标签:

【中文标题】如何在 POST 中发送 ClientId 和 ClientSecret,而不是在带有 ClientCredentialsAccessTokenProvider 的标头中发送【英文标题】:How to send ClientId and ClientSecret in a POST instead in the header with ClientCredentialsAccessTokenProvider 【发布时间】:2015-11-09 22:35:40 【问题描述】:

我的批次必须使用 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 和客户端密码被放入带有经典基本身份验证标头的标头中:

    Authorization: Basic bXktY2xpZW50LWlkIDpteS1jbGllbnQtc2VjcmV0

如果我解码字符串 bXktY2xpZW50LWlkIDpteS1jbGllbnQtc2VjcmV0

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

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

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

迈克尔

【问题讨论】:

【参考方案1】:

ClientCredentialsResourceDetails 类中有一个方法setClientAuthenticationScheme。它的默认值为AuthenticationScheme.header,您可能需要将其设置为AuthenticationScheme.form

【讨论】:

看起来不错,但是 resource.setAuthenticationScheme(AuthenticationScheme.form);没有改变请求中的任何内容。我检查一下我是否错过了什么。 我的错! resource.set客户端AuthenticationScheme(AuthenticationScheme.form);作品!谢谢

以上是关于如何在 POST 中发送 ClientId 和 ClientSecret,而不是在带有 ClientCredentialsAccessTokenProvider 的标头中发送的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有 oauth 但使用 angular 和 dotnet 自定义实现的情况下安全地发送 clientid 和 clientsecret

mqtt如何向指定clientID发送消息?有啥方法实现

C# HttpClient:如何在 POST 请求中发送查询字符串

c#udp源端口目的端口不同

C# asp.net 为啥ClientID和UniqueID有区别?

如何通过 C 中的 HTTP POST 请求发送图像或二进制数据