为什么spring-security-oauth oauth 2.0实现中需要scope参数

时间:2012-04-23 14:02:42

标签: java security oauth spring-security oauth-2.0

我正在使用spring security oauth为我公司的REST API实施OAuth 2.0提供程序。
出于某种原因,使用令牌端点spring security oauth要求客户端将其所需的范围作为请求参数发送(这种情况发生在ClientCredentialsChecker.validateScope方法中)。
据我所知,关于Access Token Scope的规范部分,scope参数是可选的,但是如果没有作用域,提供者可以决定它是否未通过授权请求。
我的问题是:

  • 我是否正确理解规范允许提供商授权 范围?
  • 有没有人知道为什么spring security oauth选择实施更严格的规范解释而不允许配置?

谢谢

1 个答案:

答案 0 :(得分:1)

我认为这里的问题实际上归结为范围绑定的概念。你是正确的,规范声明scope参数是可选的,但是是否必须在实现OAuth 2的服务中定义范围实际上取决于实现者(在本例中为Spring)。

现在来看范围绑定的概念。在实现范围或您希望能够从用户访问的信息时,您有两种基本类型 - 绑定范围和未绑定范围。使用绑定范围时,需要在创建应用程序时定义范围并获取OAuth密钥和密钥。如果实现未绑定的作用域(如Spring),则需要在第一次重定向调用期间定义作用域以使用户具有auth。在许多情况下,如果未定义范围,则实现未绑定范围的服务将使用您可以访问的一组默认用户详细信息。看来,在Spring案例中,范围是必需的。

免责声明:之前我没有使用过Spring安全OAuth实现。

只是为了给你一些关于绑定和未绑定之间区别的视觉效果,这里有一些例子:

Facebook使用未绑定的范围来请求用户数据,因此他们的初始重定向请求可能如下所示:

//construct Facebook auth URI
$auth_url = sprintf("%s?redirect_uri=%s&client_id=%s&scope=email,publish_stream", 
            $authorization_endpoint, 
            $callback_url, 
            $key);

对于Gowalla(当Gowalla仍然可用时),他们使用绑定到OAuth密钥的范围,因此当您提出初始请求时,不需要定义范围,向您发出请求看起来更像这样(注意缺少范围的参数):

//construct Gowalla auth URI
$auth_url = sprintf("%s?redirect_uri=%s&client_id=%s", 
            $authorization_endpoint, 
            $callback_url, 
            $key);

我希望有所帮助,

乔恩