zoukankan      html  css  js  c++  java
  • 关于OAuth2 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.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)

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

    客户端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();
    }
    
  • 相关阅读:
    Python3字典中items()和python2.x中iteritems()有什么区别
    python中使用zip函数出现<zip object at 0x02A9E418>
    python中字符串连接的四种方式
    Python如何规定对方输入的数字必须是整数?
    C# 自定义控件VS用户控件
    c#使用Split分割换行符
    C# 读取app.config配置文件 节点键值,提示 "配置系统未能初始化" 错误的解决方案
    安装MySql for Visual Studio的坑
    MySql Access denied for user 'root'@'localhost' (using password:YES) 解决方案
    VS2010 VS2012 VS2013 VS2015启动调试时老是提示正在下载公共符号
  • 原文地址:https://www.cnblogs.com/daikainan/p/14360105.html
Copyright © 2011-2022 走看看