关于OAuth2 Scope的理解

OAuth2 server php对于Scope的说明:http://bshaffer.github.io/oauth2-server-php-docs/overview/scope/

按照官网的解释,Scope是资源拥有者(服务端)用来授予客户端特定权限的一个参数。换句话说,Scope是服务端规定好的,不同的客户端可以申请不同权限的名称。例如服务端规定了客户端A可以获取用户基本资料,客户端B可以获取用户的评论数据,客户端C可以获取用户最新发布的说说。那么不同的客户端在申请授权时,需要跟上不同的Scope,Scope的名称由服务端来指定。

下面观察三个客户端申请授权的url:

http://www.server.com/oauth/authorize?response_type=code&client_id=client-a&scope=basic&redirect_uri=http://www.client-a.com/oauth&state=xzy

http://www.server.com/oauth/authorize?response_type=code&client_id=client-b&scope=comment&redirect_uri=http://www.client-b.com/oauth&state=xzy

http://www.server.com/oauth/authorize?response_type=code&client_id=client-c&scope=article&redirect_uri=http://www.client-c.com/oauth&state=xzy

客户端client-a通过传递scope=basic,申请服务器给予获取用户基本资料的权限。

此时服务端在接收到客户端的请求后,需要做以下事情:

1.客户端申请的权限是否存在(即服务端是否提供了这个权限供你申请,如果本身没有这个权限,客户端申请也没用)

2.服务端提供了这个权限,但是否对该客户端开放了这个权限

只有以上两个条件都满足时,客户端才能成功的申请到授权码(Authorization_code),否则会返回401 insufficient_scope错误。


如何让以上三个客户端可以分别获取到各自的授权,服务端需要这么做:

1.服务端添加scope的种类(在oauth_scopes表中添加)。

scope1

2.为客户端分配不同的scope权限(在oauth_clients表中增加)。

scope2

此时,三个客户端都能获取到权限了,但客户端A只能获取basic的权限,不能获取comment或者article的权限。因为服务端只给与了basic的权限。


如何让客户端A不仅可以获取basic的权限,也能同时获取comment和article的权限呢?

1.客户端A申请多scope(scope参数后面跟上多个值,每个值用空格隔开,空格的URL编码就是%20

http://www.server.com/oauth/authorize?response_type=code&client_id=client-a&scope=basic%20comment%20article&redirect_uri=http://www.client-a.com/oauth&state=xzy

客户端A通过传递scope=basic%20comment%20article向服务端申请basic,comment,article这三个权限。那么服务端也需要给客户端A开通这三个权限。

2.服务端为客户端A开通允许的scope(在oauth_clients表中修改)

scope3

此时,客户端A就可以获取同时拥有basic,comment,article这三个权限的授权码了。


客户端获取了授权码(Authorization_code)后,就可以通过授权码获取Access_token,再利用Access_token申请访问服务端资源了。

服务端最后需要做的就是为不同的资源指定不同的Scope,即告知申请当前资源需要具有某种Scope的权限。

$request = \OAuth2\Request::createFromGlobals();
$response = new \OAuth2\Response();
$scopeRequired = 'projects'; // this resource requires "projects" scope

if (!$this->server->verifyResourceRequest($request,$response,$scopeRequired)) {
    $response->send();
    exit();
}

发表评论

邮箱地址不会被公开。 必填项已用*标注