關於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 = \OAuth2\Request::createFromGlobals();
$response = new \OAuth2\Response();
$scopeRequired = 'projects'; // this resource requires "projects" scope
 
if (!$this->server->verifyResourceRequest($request,$response,$scopeRequired)) {
    $response->send();
    exit();
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM