按照官网的解释,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.xxxxxx.com/oauth&state=xzy
http://www.server.com/oauth/authorize?response_type=code&client_id=client-b&scope=comment&redirect_uri=http://www.xxxxxx.com/oauth&state=xzy
http://www.server.com/oauth/authorize?response_type=code&client_id=client-c&scope=article&redirect_uri=http://www.xxxxxxx.com/oauth&state=xzy
客户端client-a通过传递scope=basic,申请服务器给予获取用户基本资料的权限。
此时服务端在接收到客户端的请求后,需要做以下事情:
1. 客户端申请的权限是否存在(即服务端是否提供了这个权限供你申请,如果本身没有这个权限,客户端申请也没用)
2. 服务端提供了这个权限,但是否对该客户端开放了这个权限
只有以上两个条件都满足时,客户端才能成功的申请到授权码(Authorization_code),否则会返回401 insufficient_scope错误。
如何让以上三个客户端可以分别获取到各自的授权,服务端需要这么做:
1. 服务端添加scope的种类(在oauth_scopes表中添加)。
scope1
2. 为客户端分配不同的scope权限(在oauth_clients表中增加)。
此时,三个客户端都能获取到权限了,但客户端A只能获取basic的权限,不能获取comment或者article的权限。因为服务端只给与了basic的权限。
如何让客户端A不仅可以获取basic的权限,也能同时获取comment和article的权限呢?
1. 客户端A申请多scope(scope参数后面跟上多个值,每个值用空格隔开,空格的URL编码就是%20)
客户端A通过传递scope=basic%20comment%20article向服务端申请basic,comment,article这三个权限。那么服务端也需要给客户端A开通这三个权限。
2. 服务端为客户端A开通允许的scope(在oauth_clients表中修改)
此时,客户端A就可以获取同时拥有basic,comment,article这三个权限的授权码了。
客户端获取了授权码(Authorization_code)后,就可以通过授权码获取Access_token,再利用Access_token申请访问服务端资源了。
服务端最后需要做的就是为不同的资源指定不同的Scope,即告知申请当前资源需要具有某种Scope的权限。
$request = OAuth2Request::createFromGlobals();
$response = new OAuth2Response();
$scopeRequired = 'projects'; // this resource requires "projects" scope
if (!$this->server->verifyResourceRequest($request,$response,$scopeRequired)) {
$response->send();
exit();
}