我想自定义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}
}
我该怎么做?
答案 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。