gpt4 book ai didi

spring - 是否可以在没有客户端 key 的情况下从 Spring OAuth2 服务器获取 access_token ?

转载 作者:行者123 更新时间:2023-12-02 04:50:24 25 4
gpt4 key购买 nike

我正在使用 Spring Security 的 OAuth2 服务器实现。我试图使用 OAuth2“密码”授权类型从服务器的 /oauth/token 端点获取 access_token,仅提供用户名和密码以及客户端 ID,而不提供客户端 key 。只要我在 HTTP 请求的 Authorization header 中提供客户端 ID 和客户端 key ,就可以正常工作,如下所示:

curl -u clientid:clientsecret http://myhost ... -d "grant_type=password&username=user&password=pw&client_id=OAUTH_CLIENT"

遵循此处的建议:Spring OAuth2 disable HTTP Basic Auth for TokenEndpoint ,我设法禁用 /auth/token 端点的 HTTP 基本身份验证。但是当我尝试通过 cURL 获取 access_token 时,如下所示:

curl http://myhost ... -d "grant_type=password&username=user&password=pw&client_id=OAUTH_CLIENT"

我收到 BadCredentialsException 并且可以看到消息:

Authentication failed: password does not match stored value

在我的服务器日志中。此时我有点恼火,因为据我了解,只有当用户名和/或密码出现问题时才会显示此消息,而不是客户端 ID 和/或密码出现问题时才会出现。在 cURL 命令中另外提供客户端 key 后,如下所示:

 curl http://myhost ... -d "grant_type=password&username=user&password=pw&client_id=OAUTH_CLIENT&client_secret=SECRET"

一切又恢复正常了。

那么这是否意味着我必须以一种或另一种方式提供客户端 key 才能访问 /auth/token 端点?

PS:我知道,就安全性而言,通过 HTTP 基本身份验证保护此端点通常是一个好主意,但在某些用例中,人们宁愿不这样做。

编辑:

我似乎找到了一种省略客户端 key 的方法。这是我的 OAuth2 服务器配置(请注意对 allowFormAuthenticationForClients()autoApprove(true) 的调用):

@Configuration
@EnableAuthorizationServer
class OAuth2Config extends AuthorizationServerConfigurerAdapter {

private final AuthenticationManager authenticationManager;

public OAuth2Config(AuthenticationManager authenticationManager) {
this.authenticationManager = authenticationManager;
}

@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
endpoints.authenticationManager(this.authenticationManager);
}

@Override
public void configure(AuthorizationServerSecurityConfigurer oauth) throws Exception {
// allows access of /auth/token endpoint without HTTP Basic authentication
oauth.allowFormAuthenticationForClients();
}

@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
clients
.inMemory()
.withClient("acme")
.autoApprove(true) // <- allows for client id only
.authorizedGrantTypes("authorization_code", "refresh_token", "password").scopes("openid");
}

}

编辑二:

这里的问题:Spring Security OAuth 2.0 - client secret always required for authorization code grant与此密切相关,但处理 OAuth2 授权类型“授权代码”,这会产生不同的工作流程,就像您使用授权类型“密码”获得的工作流程一样。

最佳答案

根据规范 (RFC 6749),如果您的应用程序的客户端类型是公共(public),则不需要客户端 key 。相反,如果客户端类型是 secret ,则需要客户端 secret 。

如果 Spring 提供 API 来设置客户端类型,请尝试将客户端类型设置为 public

关于spring - 是否可以在没有客户端 key 的情况下从 Spring OAuth2 服务器获取 access_token ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43356590/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com