2013-01-03 132 views
15

我正试图理解和实现我们的新REST服务器和现有客户端应用程序之间的客户端凭据流。我设置了弹簧安全OAuth2,如this。从我的理解,到目前为止,我的服务器现在应该支持以下要求:了解OAuth2客户端凭据流

$ curl -X -v -d 'client_id=the_client&client_secret=secret&grant_type=client_credentials' -X POST "http://localhost:9090/oauth/token" 

,但我得到

InsufficientAuthenticationException: There is no client authentication 

造成Principalnull这里(弹簧安全码):

@FrameworkEndpoint 
@RequestMapping(value = "/oauth/token") 
public class TokenEndpoint extends AbstractEndpoint { 

    @RequestMapping 
    public ResponseEntity<OAuth2AccessToken> getAccessToken(Principal principal, 
      @RequestParam("grant_type") String grantType, @RequestParam Map<String, String> parameters) { 

     if (!(principal instanceof Authentication)) { 
      throw new InsufficientAuthenticationException(

所以看来,我需要首先与服务器进行身份验证。但这不是我想要做的。我想让我的两台服务器使用共享密钥相互交谈。 OAuth提供程序服务器应根据请求向(可信的)客户端服务器提供访问令牌,以便客​​户端服务器可以使用该令牌访问服务器上的所有REST资源。这应该保护REST资源免受外部访问。

后来我想向第三方提供选定的资源,并最终为服务器到服务器的通信实现一些更细粒度的安全性。但现在我需要保护REST服务器免受外部访问。

看起来好像我可能会对整个客户端凭证流或弹簧安全应用程序有一些误解,因此任何澄清都将不胜感激。

回答

18

您未验证授权服务器的客户端。

你需要做这样的事情:

curl --user the_client:secret --data "grant_type=client_credentials" http://localhost:9090/oauth/token 

这是验证客户到授权服务器,然后指定grant_type等参数。这将返回一个类型为“承载者”的访问令牌,其范围由oauth客户端详细信息确定。一旦拥有令牌,您可以通过设置授权标头来访问受保护的资源:

curl -H "Authorization: Bearer <accessToken>" <resourceUrl> 
+0

感谢您的回答。那么我的思路基本正确吗?对于客户端凭证流,我使用客户端凭证和授予类型请求令牌,然后使用该令牌访问受保护的资源?我想我只是有一个设置错误,因为使用sparklr示例项目我上面提到的调用确实有效。 – Pete

+0

我认为你是在正确的轨道上。客户首先使用特定的授权类型请求令牌。然后,只需在访问受保护资源时将auth头中的令牌传递给auth头。我通过访问资源的示例更新了我的答案。 – kldavis4

相关问题