当前位置: 首页 > 知识库问答 >
问题:

有可能从Spring OAuth2服务器获得一个access_token而没有客户端机密吗?

邵轶
2023-03-14

我使用的是Spring Security的OAuth2服务器实现。我正在尝试使用OAuth2“password”授予类型从服务器的/oauth/tokenendpoint获取access_token,方法是只提供用户名、密码和客户端id,而不提供客户端机密。只要在HTTP请求的authorization头中提供客户端id和客户端机密,就可以正常工作,如下所示:

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

按照这里的建议:Spring OAuth2为令牌endpoint禁用HTTP基本身份验证,我设法为/Auth/tokenendpoint禁用了HTTP基本身份验证。但是当我试图通过cURL获取access_token时,如下所示:

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

我得到一个BadCredentialsException并且可以看到以下消息:

身份验证失败:密码与存储值不匹配

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

一切又好起来了。

那么这是否意味着我必须以某种方式提供客户端机密来访问/auth/tokenendpoint?

PS:我知道,关于安全性,通过HTTP基本身份验证来保护这个endpoint通常是一个好主意,但是有些用例是可以不做的。

编辑:

我好像找到了省略客户秘密的方法。下面是我的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");
    }

}

编辑二:

共有1个答案

亢仰岳
2023-03-14

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

如果Spring提供了一个API来设置客户机类型,那么尝试将客户机类型设置为public。

 类似资料:
  • 我有一个react本机应用程序,它使用与。NET Core2.1通信的signalR。 套接字连接没有任何错误。一切都很好。但是服务器不能响应客户端的ping消息,并返回504给客户端。当返回504时,客户端的连接关闭。在hubconnection.onclose()处理。然后客户端需要重新连接。 proxy_read_timeout可以设置为高毫秒。但很乱。 所以我不能在客户机上有效地使用kee

  • 在同步TCP服务器的情况下,当一个客户端连接时,我会得到一个客户端示例的参考: 现在我想使用Netty使用异步TCP服务器,那么有没有任何方法可以获得当连接新客户机时创建的ChannelPipeline或ChannelHandler的引用。 在服务器端:示例代码:ServerBootstrap bootstrap=new ServerBootstrap(new NioServerSocketCha

  • 我一直在尝试使用Zuul和Eureka连接微服务,除了通过基于ServiceID的Zuul重新路由之外,大部分都成功了。我拥有的是Spring Boot Zuul和Eureka应用程序,以及一个在Eureka注册的基于节点的微服务。Zuul和微服务都在Eureka注册,并显示在Eureka控制面板上,但是,当我试图通过Zuul路由到微服务时,我会遇到以下异常: 通过IP路由似乎有效,但我不需要它。

  • 我刚刚做了一个Firebase云函数: 我部署了这个函数,得到了一个函数URL。当我请求这个网址从我的浏览器我得到以下消息: “错误:禁止您的客户端没有从此服务器获取URL/200的权限。” 我刚刚更新到Firebase Blaze计划,因为我认为Spark计划有局限性,但它仍然不起作用。 在我的firebase云函数日志中写着“函数执行耗时572毫秒,完成状态代码:302”。 我的cron作业“

  • 编辑:最后,问题似乎来自io.emit()中缺少第二个参数。现在它起作用了,非常感谢:)

  • 我正在创建我的产品,并与这个问题。有一天,我设置了Socket.io,一切都很好。第二天,我将服务器和客户端从http迁移到HTTPS。迁移后客户端和服务器端仍然连接,但不能从客户端发射到服务器,从服务器发射到客户端。 我的ssl证书位于和中,它们加载正确。运行在上的服务器 我的示例react组件。我的react应用程序运行在上。HTTPS连接良好,工作良好。 我该怎么办?也许我在中错误地使用了s