了解 OAuth2 客户端凭据流

2022-09-03 06:39:05

我正在尝试理解并实现新 REST 服务器和现有客户端应用之间的客户端凭据流。我已经像这样设置了弹簧安全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服务器免受外部访问。

看起来我可能对整个客户端凭据流或弹簧安全性的应用有一些误解,因此任何澄清将不胜感激。


答案 1

您没有向授权服务器验证客户端。

您需要执行如下操作:

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

这是对授权服务器的客户端进行身份验证,然后指定grant_type和其他参数。这将返回类型为“持有者”的访问令牌,其作用域由 oauth 客户端详细信息确定。获得令牌后,可以通过设置授权标头来访问受保护的资源:

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

答案 2