我正在尝试理解并实现新REST服务器和现有客户端应用之间的客户端凭据流。我设置了像this这样的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
引起的(春季安全码):
@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服务器免受外部访问。
看起来我可能对整个客户端凭证流程或弹簧安全性的应用存在一些误解,所以任何澄清都会非常感激。
答案 0 :(得分:19)
您没有向授权服务器验证您的客户端。
你需要做这样的事情:
curl --user the_client:secret --data "grant_type=client_credentials" http://localhost:9090/oauth/token
这是对授权服务器的客户端进行身份验证,然后指定grant_type和其他参数。这将返回“bearer”类型的访问令牌,其范围由oauth客户端详细信息确定。获得令牌后,您可以通过设置授权标头来访问受保护的资源:
curl -H "Authorization: Bearer <accessToken>" <resourceUrl>