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

dtcbnfnu  于 2022-09-18  发布在  Spring
关注(0)|答案(2)|浏览(167)

我正在尝试配置一个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
    }

我找到了客户端身份验证方案参数,但仅支持查询、表单和表头

vwoqyblh

vwoqyblh1#

您必须在客户身份验证方案和身份验证方案中使用AuthenticationScheme.form,以将数据放入内容类型为APPLICATION/x-www-form-urlencode的正文中。这对我很管用。

请求将是这样的:

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
uqcuzwp8

uqcuzwp82#

为便于将来参考,正确答案是在客户端注册配置中将客户端身份验证方法设置为client_secret_post。应该是这样的

private fun resourceDetails(): BaseOAuth2ProtectedResourceDetails? {
    val resourceDetails: BaseOAuth2ProtectedResourceDetails = ClientCredentialsResourceDetails()
    resourceDetails.id = clientId
    resourceDetails.clientId = clientId
    resourceDetails.clientSecret = clientSecret
    resourceDetails.accessTokenUri = accessTokenUri
    resourceDetails.clientAuthenticationMethod = ClientAuthenticationMethod.CLIENT_SECRET_POST
    return resourceDetails
}

相关问题