Spring boot 使用Spring boot Oauth2注册客户端-tokenUri与issuerUri

Spring boot 使用Spring boot Oauth2注册客户端-tokenUri与issuerUri,spring-boot,oauth-2.0,spring-security-oauth2,Spring Boot,Oauth 2.0,Spring Security Oauth2,对不起,各位,这可能是个新问题。我有点迷路了 我的Spring boot环境为我提供了用于客户端授权的KeyClope,它给了我这些 spring.security.oauth2.resourceserver.jwt.issuer-uri spring.security.oauth2.client.provider.keycloak.issuer-uri spring.security.oauth2.client.registration.keycloak.* # client-id, secr

对不起,各位,这可能是个新问题。我有点迷路了

我的Spring boot环境为我提供了用于客户端授权的KeyClope,它给了我这些

spring.security.oauth2.resourceserver.jwt.issuer-uri
spring.security.oauth2.client.provider.keycloak.issuer-uri
spring.security.oauth2.client.registration.keycloak.* # client-id, secret, provider, grant-type
我在ClientRegistration上注意到.issueUri(字符串uri)直到SpringSecurityV5.4.x才可用。我使用的是5.3.5,虽然我可以提高。我不知道有什么区别。正如我所预料的,当我使用.tokenUri(issuerUri)时,我会得到一个错误。我相信它们是不同的模式/API,但我不知道应该在5.3.5 API中设置什么

原因:org.springframework.security.oauth2.client.ClientAuthorizationException:[无效的\u令牌\u响应]尝试检索OAuth 2.0访问令牌响应时出错:405方法不允许:[{“错误”:“RESTEASY003650:找不到POST的资源方法,返回405,并带有允许标头”}]


所以作为一个新手,我不明白为什么我有4个URI选项,以及它们是做什么的。谷歌和javadoc帮不了什么忙,所以我想我只是不知道该去哪里学习。我知道如何解决这个问题的唯一方法是手动对URI进行自己的HTTP调用并获取身份验证令牌,但这将破坏Oauth2库的用途。

tokenUri
表示令牌端点的URI。例如:

https://authz.example.org/auth/realms/myrealms/protocol/openid-connect/token
issuerUri
是标识授权服务器的URI:

https://authz.example.org/auth
对于更具体的URI(如令牌URI),颁发者URI通常是其根

关于您的具体错误,我可以想象KeyClope声明您不能发布到
https://authz.example.org/auth
,这是真的。您应该发布到令牌端点

issuer uri
Spring启动属性应使Spring Security查找其他端点,并将它们添加到默认的
ClientRegistration
。因此,我不确定您为什么还要尝试以编程方式配置
ClientRegistration
。也就是说,如果您确实需要以编程方式创建
ClientRegistration
,您可以像这样使用颁发者URI,Spring Security将完成其余工作:

@Bean
ClientRegistrationRepository注册(){
ClientRegistration注册=ClientRegistration
.forIssuerLocation(“https://authz.example.org/auth")
.build();
返回新的InMemoryClientRegistrationRepository(注册);
}

您提供了一个很好的提示,即ClientRegistration类允许使用颁发者URI,而ClientRegistration不允许。