在尝试访问某些受保护的端点时,我的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服务器时也会发生这种情况。
答案 0 :(得分:2)
令牌端点(oauth/token
)受到保护,请参阅TokenEndpoint
:
必须使用Spring Security Authentication对客户端进行身份验证才能访问此端点,并从身份验证令牌中提取客户端ID。安排此操作的最佳方法(根据OAuth2规范)是为此端点使用标准Spring Security支持的HTTP基本身份验证。
默认情况下,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;)将其与主机区分开来。