【问题标题】:Spring security OAuth2 request as object instead of query parametersSpring security OAuth2 请求作为对象而不是查询参数
【发布时间】:2017-07-01 09:07:40
【问题描述】:

我想自定义 OAuth 端点 URI。 我想在帖子正文中发送参数而不是查询参数。

现在我的要求是 -

example.com/oauth/token?grant_type=password&client_id={CLIENT_ID}&client_secret={CLIENT_SECRET}&username={USERNAME}&password={PASSWORD}

但我想要这样。

example.com/oauth/token

请求正文 -

{
    grant_type=password,
    client_id={CLIENT_ID},
    client_secret={CLIENT_SECRET},
    username={USERNAME},
    password={PASSWORD}
}

我该怎么做?

【问题讨论】:

  • OAuth 的重点在于动词和 URL 模式是标准化的......您使用 POST 而不是 GET 的用例是什么?
  • 只是为了让它更安全。我不想在 url 中公开我的参数值。
  • 您应该始终使用 HTTPS。 如果不是,则 GET 和 POST 参数都以纯文本形式通过网络发送,而且都不安全。我建议使用 HTTPS 并遵守标准。
  • 我知道。我关心的不是请求类型。我不想在 URL 中暴露我的用户名、密码和其他参数。因此,我希望 OAuth 接受它作为应用程序/json 主体。

标签: spring oauth spring-security-oauth2


【解决方案1】:

正确实现的授权服务器的令牌端点不接受 GET 请求,因为 RFC 6749,“3.2. Token Endpoint”如下所示:

客户端在发出访问令牌请求时必须使用 HTTP“POST” 方法。

因此,您的授权服务器的令牌端点应该拒绝 GET 请求。

RFC 6749,“4.3. Resource Owner Password Credentials Grant”表示使用资源所有者密码凭证流的令牌请求的请求参数应以“application/x-www-form-urlencoded”的格式嵌入到请求正文中。以下是“4.3.2. Access Token Request”的节选。

 POST /token HTTP/1.1
 Host: server.example.com
 Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
 Content-Type: application/x-www-form-urlencoded

 grant_type=password&username=johndoe&password=A3ddj3w

因此,您不必自定义授权服务器。如果服务器实现正确,其令牌端点接受 POST 请求。

【讨论】:

    【解决方案2】:

    spring-oauth2 创建的令牌端点也已经处理了 POST。 很难对其进行自定义以接受 JSON 请求正文,因为 TokenEndpoint 类期望所有参数为 @RequestParam 参数。

    但是,如果您担心安全性(因为 HTTPs 不保护查询参数),您确实可以通过 post 发送请求参数。只需以“form-data”或“x-www-form-urlencoded”的形式发送请求即可。这是在请求正文中发送任意键值参数的两种方式,在服务器看来,它们是常规请求参数。因此,让您的客户使用它是一个问题。

    另外,请注意,在 spring-oauth2 中,可以禁用 GET 端点,这样会强制您的客户端通过上述方式之一使用 POST。

    【讨论】:

      猜你喜欢
      • 2017-12-22
      • 1970-01-01
      • 2018-04-22
      • 2016-07-19
      • 1970-01-01
      • 2020-05-11
      • 2014-11-05
      • 1970-01-01
      • 2012-04-11
      相关资源
      最近更新 更多