正文中的 Spring Boot OAuth2RestTemplate 客户端凭据

Posted

技术标签:

【中文标题】正文中的 Spring Boot OAuth2RestTemplate 客户端凭据【英文标题】:Spring Boot OAuth2RestTemplate Client Credentials in Body 【发布时间】:2020-09-30 21:55:46 【问题描述】:

我试图配置 Spring Boot OAuth2RestTemplate 来为 OAuth2 资源服务器发出访问令牌。资源服务器只接受请求正文中的凭据。

类似这样的:

grant_type: "client_credentials"
scope: ""
client_id: "client"
client_secret: "superdupersecret"

在 Postman 中,我可以通过在“获取新的访问令牌”对话框中选择“在正文中发送客户端凭据”来归档它。

但是,我需要在我的 Spring Boot 应用程序中获取此令牌。我调试了 OAuth2RestTemplate(以及模板使用的类),但找不到将其配置为将凭据作为请求正文发送的方法。

我是完全走错了路还是只是错过了什么?

目前我这样配置模板:

 private fun resourceDetails(): BaseOAuth2ProtectedResourceDetails? 
        val resourceDetails: BaseOAuth2ProtectedResourceDetails = ClientCredentialsResourceDetails()
        resourceDetails.id = clientId
        resourceDetails.clientId = clientId
        resourceDetails.clientSecret = clientSecret
        resourceDetails.accessTokenUri = accessTokenUri
        //resourceDetails.clientAuthenticationScheme = AuthenticationScheme.header
        return resourceDetails
    

我找到了 clientAuthenticationScheme 参数,但只支持查询、表单和标题

【问题讨论】:

找到解决方案了吗? 【参考方案1】:

您必须在 clientAuthenticationScheme 和 authenticationScheme 中使用 AuthenticationScheme.form 将数据放入内容类型为 application/x-www-form-urlencoded 的正文中。它对我有用。

请求将是这样的:

POST /auth/oauth/v2/token HTTP/1.1
Host: localhost:8080
Content-Type: application/x-www-form-urlencoded
Content-Length: 136

client_id=user1&client_secret=pass1&grant_type=client_credentials&scope=admin

【讨论】:

以上是关于正文中的 Spring Boot OAuth2RestTemplate 客户端凭据的主要内容,如果未能解决你的问题,请参考以下文章

如何在 spring-boot Web 客户端中发送请求正文?

Spring boot——使用Freemarker撰写html邮件正文

从请求正文 Spring Boot 中删除空属性

缺少请求正文的 Spring Boot POST 请求?

没有请求正文的对象的 Spring Boot RestClient 发布导致错误请求

在 ResponseEntity 正文中返回 null (Spring Boot RESTful)