Spring安全性Oauth2资源所有者密码凭证授权

时间:2014-07-11 14:21:26

标签: spring security oauth passwords

刚刚在我的eclipse IDE中安装了spring security oauth2。我试图实现的服务将由第二方用户通过其安装的应用程序使用,因此我选择使用密码授予类型。根据我对Oauth2的理解,以下请求应该适用于演示sparklr2服务,而无需我使用用户名和密码参数。即

POST http://localhost:8080/sparklr2/oauth/token?grant_type=password&client_id=my-trusted-client&scope=trust&username=marissa&password=koala

但我一直在

<oauth>
<error_description>
Full authentication is required to access this resource
</error_description>
<error>unauthorized</error>
</oauth>

我在此请求中遗漏了某些内容,或者我是否需要在repo中启用某些内容

2 个答案:

答案 0 :(得分:7)

虽然这个问题有点陈旧,但我想就此发表我的研究结果。

对于Spring OAuth,您需要指定一个客户端ID才能访问令牌端点,但是没有必要为密码授予类型指定客户端密码。

下一行是没有任何客户端密钥的密码授予类型的授权服务器客户端的示例。 Yout只需要在扩展AuthorizationServerConfigurerAdapter的类中添加它们:

@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {    
        clients.inMemory()
            .withClient("clientId")
            .authorizedGrantTypes("password")
            .authorities("ROLE_CLIENT")
            .scopes("read");
    }
 }

此外,确实可以避免令牌端点中的HTTP基本身份验证,并在POST调用中将client_id添加为另一个请求参数。

要实现这一点,您只需要将这些行添加到与以前相同的类中:

@Override
public void configure(AuthorizationServerSecurityConfigurer oauthServer) throws Exception {
    oauthServer.allowFormAuthenticationForClients();
}

现在我们可以通过这种方式调用令牌端点,按照Stormpath webpage

中的示例看似更正确
POST http://localhost:8080/sparklr2/oauth/token?grant_type=password&client_id=clientId&scope=read&username=marissa&password=koala

答案 1 :(得分:6)

似乎Spring OAuth2不支持无秘密OAuth2客户端的密码授予类型。这可能是根据OAuth2规范:http://tools.ietf.org/html/rfc6749#section-4.3.2,虽然规范似乎表明客户端身份验证并不总是必需的(这对我来说不是很清楚)。

这意味着当使用密码授予类型调用令牌端点时,您需要传入客户端ID和密码(使用基本身份验证),这也意味着如果客户端不能使用密码授予有秘密(您可能仍然可以使用隐式流程)。

在sparklr2中,my-trusted-client没有定义秘密,这就是您的呼叫失败的原因。

如果您想要查看密码授予类型,可以尝试my-trusted-client-with-secret

curl -u my-trusted-client-with-secret:somesecret "http://localhost:8080/sparklr2/oauth/token?grant_type=password&username=marissa&password=koala"