了解OAuth2用户端凭证流(Understanding OAuth2 Client credent

2019-07-17 19:48发布

我试图理解和执行客户端凭证我们新的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

造成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服务器从外部访问。

看起来我可能对整个客户端凭证流或弹簧安全的应用就在那里,所以任何澄清,将不胜感激一些误解。

Answer 1:

您还没有验证您的客户端认证服务器。

你需要做的是这样的:

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

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

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


文章来源: Understanding OAuth2 Client credentials flow