如何在 Spring Security OAuth2 中生成没有 client_secret 的令牌

Nav*_*wat 6 java spring oauth spring-security spring-security-oauth2

我有一个基于 Spring Security OAuth 2.0 的应用程序,配置了 JDBC 和 LDAP。根据 OAuth 2.0 规范,客户端密码必须。

当我使用以下 URL 生成令牌时,它会生成令牌并且工作正常:

/oauth/token?grant_type=password&client_secret=test&client_id=test&username=test&password=test
Run Code Online (Sandbox Code Playgroud)

当我尝试在没有client_secret它的情况下生成令牌时:

401:未经授权

error_description: "错误的用户凭据"

但我想生成没有client_secret像的令牌:

/oauth/token?grant_type=password&client_secret=test&client_id=test&username=test&password=test
Run Code Online (Sandbox Code Playgroud)

securityConfig.java

/oauth/token?grant_type=password&username=test&password=test
Run Code Online (Sandbox Code Playgroud)

Pat*_*k T 0

不幸的是,没有简单的方法可以解决您的问题。Spring security对该标准的解释非常严格:

这是 OAuth2 规范RFC 6749 第 4.3.2 节(资源所有者密码凭证授予 - 访问令牌请求)的引用:

如果客户端类型是机密的或者向客户端颁发了客户端
凭据(或分配了其他身份验证要求),则
客户端必须按照第 3.2.1 节中所述向授权服务器进行身份验证

对于 Spring Security,密码授予始终属于这一类。第 3.2.1 节需要客户端 ID 和客户端密码。

Spring Security文档也是这样的: 28.1.1授权服务器

除非您想更改 Spring Security 的 OAuth2 的身份验证逻辑(不推荐),否则您会陷入困境。

从我的角度来看没有问题。客户端 ID 和密码不需要您花费任何费用,并且可以为您的应用程序带来更多的安全性。

  • 我不明白这一点。如果我使用 Web 客户端与我的 API 对话,我是否应该在某处硬编码“client_id”和“client_secret”,或者只是将其发送给客户端?我不明白这有什么意义。^^ (7认同)
  • 我对此投了反对票,因为我相信拥有一个不使用资源所有者/密码授予来保守自己的客户端秘密的非机密(公共)客户端是合法的,并且这是真正的答案。如果我被证明是错误的,我很高兴再次投票,但以目前的形式,我认为这个答案具有误导性,同时通过引用规范听起来很权威。 (2认同)