【问题标题】:ResourceOwnerPasswordResourceDetails - Pass clientid and secret to generate oauth2 tokenResourceOwnerPasswordResourceDetails - 传递 clientid 和 secret 以生成 oauth2 令牌
【发布时间】:2017-10-07 03:30:52
【问题描述】:

我按照question 中提到的公认答案生成 OAuth2 令牌。但是我得到 HTTP 401 响应。当我调试时,我看到 clientidclientsecret 没有作为 HTTP 请求中表单的一部分传递。我只看到下面列出的值被传递。为了通过clientidclientsecret,我还应该做些什么吗?

{grant_type=[password], username=[username], password=[password]}

【问题讨论】:

  • @dur 在标题中我看到 [Authorization=[Basic Y3RwX2lkOmN0cF9zZWNyZXQ=]]
  • 当我使用 rest client 运行它时,我将所有这些作为表单正文的一部分传递。
  • @dur 授权服务器由我无权访问的第三方应用程序管理。客户端 ID 和密码与您提到的相同。我怀疑的另一件事是内容类型。使用外部休息客户端运行时,我将内容类型提供为“application/x-www-form-urlencoded”。但是我没有在程序中明确设置。我必须这样做吗?
  • 它现在可以工作了 :) 必须设置 resource.setClientAuthenticationScheme(AuthenticationScheme.form);

标签: java spring spring-boot spring-security oauth-2.0


【解决方案1】:

您的客户端默认使用 HTTP 基本身份验证方案,但您的服务器需要“表单”身份验证方案。

您的服务器不符合 OAuth 2,请参阅 RFC 6749

2.3.1.客户密码

拥有客户端密码的客户端可以使用 HTTP Basic [RFC2617] 中定义的身份验证方案,用于进行身份验证 授权服务器。客户端标识符使用 “application/x-www-form-urlencoded”编码算法 附录B,编码值作为用户名;客户端 密码使用相同的算法进行编码并用作 密码。授权服务器必须支持 HTTP Basic 用于认证客户端的认证方案 客户密码。

但是你可以把你的客户端的认证方案改成“form”,见OAuth 2 Developers Guide

clientAuthenticationScheme: 客户端用于对访问令牌端点进行身份验证的方案。建议值:“http_basic”和“form”。默认值:“http_basic”。请参阅 OAuth 2 规范的第 2.1 节。

【讨论】:

  • 感谢您的解释指出。就我而言,最初我将客户端身份验证方案设置为 AuthenticationScheme.header,但我得到了 invalid_client_id。将其更改为 AuthenticationScheme.query 后,效果很好。
猜你喜欢
  • 2018-01-06
  • 1970-01-01
  • 1970-01-01
  • 2015-04-19
  • 1970-01-01
  • 2014-05-19
  • 1970-01-01
  • 2020-05-02
  • 1970-01-01
相关资源
最近更新 更多