了解 OAuth2 客户端凭据流
Posted
技术标签:
【中文标题】了解 OAuth2 客户端凭据流【英文标题】:Understanding OAuth2 Client credentials flow 【发布时间】:2012-12-17 21:08:30 【问题描述】:我正在尝试了解并实现我们的新 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
引起(spring-security 代码):
@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 服务器免受外部访问。
看起来我可能对整个客户端凭据流程或那里的 spring-security 应用存在一些误解,因此将不胜感激。
【问题讨论】:
【参考方案1】:您没有向授权服务器验证您的客户端。
你需要做这样的事情:
curl --user the_client:secret --data "grant_type=client_credentials" http://localhost:9090/oauth/token
这是向授权服务器验证客户端,然后指定 grant_type 和其他参数。这将返回类型为“bearer”的访问令牌,其范围由 oauth 客户端详细信息确定。获得令牌后,您可以通过设置 Authorization 标头来访问受保护的资源:
curl -H "Authorization: Bearer <accessToken>" <resourceUrl>
【讨论】:
感谢您的回答。所以我的思路基本正确?对于客户端凭据流,我请求带有客户端凭据和授权类型的令牌,然后使用该令牌访问受保护的资源?我想我只是有一个设置错误,因为使用 sparklr 示例项目,我上面提到的调用确实有效.. 我认为你是在正确的轨道上。客户端首先使用特定的授权类型请求令牌。然后,您只需在访问受保护资源时在 auth 标头中传递令牌。我已经用访问资源的示例更新了我的答案。以上是关于了解 OAuth2 客户端凭据流的主要内容,如果未能解决你的问题,请参考以下文章
Office 365 客户端凭据中的错误回调授予 OAuth2 流
通过 Spring Boot Keycloak 集成的 OAuth2 客户端凭据流