在 Spring Security OAuth2 中使用 auth_code grant 是否可以进行匿名身份验证?
Is anonymous authentication possible with auth_code grant in Spring Security OAuth2?
我正在尝试使用 SpringBoot 1.5.13 和 spring-security-oauth2 2.0.15.RELEASE.
实现 OAuth2 客户端
我希望能够通过 auth_code 授权来授权 匿名用户 。
但是,在尝试完成身份验证流程时,我遇到了 运行 问题。
因为我不想调用任何其他外部服务来获取用户身份信息,所以我使用 DefaultTokenServices
。 DefaultTokenServices
的操作需要一个 TokenStore,所以我提供了最简单的一个 - InMemoryTokenStore
.
我试过两种方法都失败了:
1。重定向到 OAuth2ClientAuthenticationProcessingFilter
如果我在授权授予 URL 后将用户重定向到 OAuth2ClientAuthenticationProcessingFilter
过滤器,过滤器会正确请求并获取访问令牌。然而,它接下来要做的是:
OAuth2Authentication result = tokenServices.loadAuthentication(accessToken.getValue());
并且该调用在 BadCredentialsException("Could not obtain user details from token")
上失败,因为 DefaultTokenService
试图调用 tokenStore#readAccessToken
,但此时 InMemoryTokenStore
完全是空的。
2。重定向到另一个 URL(简单的 RestController)
如果我在授权授予后将用户重定向到与 OAuth2ClientAuthenticationProcessingFilter
不匹配的另一个 URL,我什至无法获得访问令牌。
尝试在 RestController 中调用 restTemplate.getAccessToken()
时,调用在 AccessTokenProviderChain
中失败,原因如下:
if (auth instanceof AnonymousAuthenticationToken) {
if (!resource.isClientOnly()) {
throw new InsufficientAuthenticationException(
"Authentication is required to obtain an access token (anonymous not allowed)");
}
}
编辑: 我尝试使用我自己的 AccessTokenProviderChain
实现,它只是省略了这个检查,并且与 clientTokenServices
相关的部分,乍一看似乎有效。但我不确定这是否是一种足以支持多租户的正确方法(多个匿名并发用户通过多个 OAuth2 提供商授权)。
显然我的身份验证是匿名身份验证,我需要一个匿名身份验证流程!我知道在 Spring Security 5.2.x 中完全有可能,但我不明白如何在 spring-security-oauth2?
中做到这一点
难道不能用auth_code授权进行匿名授权吗?
因此,匿名身份验证似乎无法与 OAuth2 auth_code 授权一起使用,如这个未解决的错误中所述:https://github.com/spring-projects/spring-security-oauth/issues/1842
我已经通过放弃 spring 安全 oauth 库并转移到 ScribeJava 解决了这个问题。
我正在尝试使用 SpringBoot 1.5.13 和 spring-security-oauth2 2.0.15.RELEASE.
实现 OAuth2 客户端我希望能够通过 auth_code 授权来授权 匿名用户 。
但是,在尝试完成身份验证流程时,我遇到了 运行 问题。
因为我不想调用任何其他外部服务来获取用户身份信息,所以我使用 DefaultTokenServices
。 DefaultTokenServices
的操作需要一个 TokenStore,所以我提供了最简单的一个 - InMemoryTokenStore
.
我试过两种方法都失败了:
1。重定向到 OAuth2ClientAuthenticationProcessingFilter
如果我在授权授予 URL 后将用户重定向到 OAuth2ClientAuthenticationProcessingFilter
过滤器,过滤器会正确请求并获取访问令牌。然而,它接下来要做的是:
OAuth2Authentication result = tokenServices.loadAuthentication(accessToken.getValue());
并且该调用在 BadCredentialsException("Could not obtain user details from token")
上失败,因为 DefaultTokenService
试图调用 tokenStore#readAccessToken
,但此时 InMemoryTokenStore
完全是空的。
2。重定向到另一个 URL(简单的 RestController)
如果我在授权授予后将用户重定向到与 OAuth2ClientAuthenticationProcessingFilter
不匹配的另一个 URL,我什至无法获得访问令牌。
尝试在 RestController 中调用 restTemplate.getAccessToken()
时,调用在 AccessTokenProviderChain
中失败,原因如下:
if (auth instanceof AnonymousAuthenticationToken) {
if (!resource.isClientOnly()) {
throw new InsufficientAuthenticationException(
"Authentication is required to obtain an access token (anonymous not allowed)");
}
}
编辑: 我尝试使用我自己的 AccessTokenProviderChain
实现,它只是省略了这个检查,并且与 clientTokenServices
相关的部分,乍一看似乎有效。但我不确定这是否是一种足以支持多租户的正确方法(多个匿名并发用户通过多个 OAuth2 提供商授权)。
显然我的身份验证是匿名身份验证,我需要一个匿名身份验证流程!我知道在 Spring Security 5.2.x 中完全有可能,但我不明白如何在 spring-security-oauth2?
中做到这一点难道不能用auth_code授权进行匿名授权吗?
因此,匿名身份验证似乎无法与 OAuth2 auth_code 授权一起使用,如这个未解决的错误中所述:https://github.com/spring-projects/spring-security-oauth/issues/1842
我已经通过放弃 spring 安全 oauth 库并转移到 ScribeJava 解决了这个问题。