Spring安全OAuth2请求作为对象而不是查询参数

时间:2017-02-13 11:34:06

标签: spring oauth spring-security-oauth2

我想自定义OAuth端点URI。 我想在post body中发送参数而不是查询参数。

现在我的请求就像 -

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}
}

我该怎么做?

2 个答案:

答案 0 :(得分:2)

正确实施的授权服务器的令牌端点不接受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请求。

答案 1 :(得分:2)

spring-oauth2创建的令牌端点也已经处理了POST。 很难自定义它来接受JSON请求体,因为TokenEndpoint类期望所有参数都为@RequestParam参数。

但是,如果您关注的是安全性(因为HTTP不保护查询参数),您确实可以通过post发送请求参数。这只是以“#form; data-data"”形式发送请求的问题。或" x-www-form-urlencoded"。这两种方式在请求主体中发送任意键值参数的方式,以服务器显示的方式,因为它们是常规请求参数。所以这是让你的客户使用它的问题。

另请注意,在spring-oauth2中,可以禁用GET端点,这样就可以强制客户端使用上述方法之一来使用POST。