client_id和client_secret通过param vs在url中发送

时间:2017-12-05 20:43:27

标签: spring spring-security oauth oauth-2.0 spring-security-oauth2

在尝试访问某些受保护的端点时,我的Oauth2服务器(Spring)出现了一些问题。

如果我想获得一个令牌(通过Zuul网关),我会做这样的事情:

http://localhost:4444/auth/oauth/token?client_id=gateway&client_secret=1234&grant_type=password&username=user&password=password

(以上客户端和用户正确存在且内容类型为application / x-www-form-urlencoded)。

这个电话不起作用,但是,如果我这样做:

gateway:1234@localhost:4444/auth/oauth/token?grant_type=password&username=user&password=password

然后,它有效。

这被认为是正常行为吗?据我所知,这应该有效。当我将这些作为参数发送时,但当我修改网址时,它就像id和秘密一样没有被处理,它被采取并且一切正常。我需要额外实施一些东西吗?

为了澄清,Oauth2服务器在我发送client_id和client_secret时就像在第二个url中那样工作,但是如果我将它们作为params(第一个url)发送,那么它就没有了。

您可以在此处查看代码(OAuth2-service):https://github.com/otamega93/CloudBasedUserRegistration2/tree/master/OAuth2-service

配置主要在OAuth2Configuration,WebSecurityConfig和AuthServerApplication。我和Postman一起测试。当我直接访问Oauth2服务器时也会发生这种情况。

1 个答案:

答案 0 :(得分:2)

令牌端点(oauth/token)受到保护,请参阅TokenEndpoint

  

必须使用Spring Security Authentication对客户端进行身份验证才能访问此端点,并从身份验证令牌中提取客户端ID。安排此操作的最佳方法(根据OAuth2规范)是为此端点使用标准Spring Security支持的HTTP基本身份验证。

并查看OAuth 2 Developers Guide

  

默认情况下,Spring OAuth在@Configuration支持中使用客户机密钥的HTTP基本身份验证为您保护令牌端点。在XML中不是这种情况(因此应该明确地保护它)。

客户端必须使用基本身份验证方案对自身进行身份验证,因此客户端必须向请求添加Authorization标头,请参阅RFC 2617

  

要获得授权,客户端会发送用户ID和密码,   在base64 [7]内用单个冒号(":#34;)字符分隔   凭证中的编码字符串。

     
 basic-credentials = base64-user-pass
 base64-user-pass  = <base64 [4] encoding of user-pass,
                     except not limited to 76 char/line>
 user-pass   = userid ":" password
 userid      = *<TEXT excluding ":">
 password    = *TEXT
     

Userid可能区分大小写。

     

如果用户代理希望发送用户ID&#34;阿拉丁&#34;和密码     &#34;打开芝麻&#34;,它将使用以下标题字段:

     
 Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==

您的第一个请求不包含Authorization标头。

您的第二个请求包含一个带有&#34; userinfo&#34;的网址。子组件,请参阅RFC 3986

  

userinfo子组件可以包含用户名,也可以选择   有关如何获得访问权限的特定于方案的信息   资源。用户信息(如果存在)后跟a   商业符号(&#34; @&#34;)将其与主机区分开来。