了解OAuth2客户端凭据流

我正在尝试理解并实现新REST服务器和现有客户端应用程序之间的客户端凭据流。 我已经像这样设置了spring-security 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 

Principal在这里为null引起的(spring-security code):

 @FrameworkEndpoint @RequestMapping(value = "/oauth/token") public class TokenEndpoint extends AbstractEndpoint { @RequestMapping public ResponseEntity getAccessToken(Principal principal, @RequestParam("grant_type") String grantType, @RequestParam Map parameters) { if (!(principal instanceof Authentication)) { throw new InsufficientAuthenticationException( 

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

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

看起来我可能对整个客户端凭证流程或弹簧安全的应用有一些误解,所以任何澄清将非常感激。

您没有向授权服务器validation您的客户端。

你需要做这样的事情:

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

这是向授权服务器validation客户端,然后指定grant_type和其他参数。 这将返回类型为“bearer”的访问令牌,其范围由oauth客户端详细信息确定。 获得令牌后,您可以通过设置Authorization标头来访问受保护的资源:

 curl -H "Authorization: Bearer "