授權(quán)驗證(Authentication)

2018-02-24 15:40 更新

入門(Getting Started)?應(yīng)用結(jié)構(gòu)(Application Structure)?請求處理(Handling Requests)?關(guān)鍵概念(Key Concepts)?配合數(shù)據(jù)庫工作(Working with Databases)?接收用戶數(shù)據(jù)(Getting Data from Users)?顯示數(shù)據(jù)(Displaying Data)?安全(Security)?緩存(Caching)?RESTful Web 服務(wù)?

快速入門(Quick Start)資源(Resources)控制器(Controllers)路由(Routing)格式化響應(yīng)(Response Formatting)授權(quán)驗證(Authentication)速率限制(Rate Limiting)版本化(Versioning)錯誤處理(Error Handling)

開發(fā)工具(Development Tools)?測試(Testing)?高級專題(Special Topics)?小部件(Widgets)?助手類(Helpers)?

認證

和Web應(yīng)用不同,RESTful APIs 通常是無狀態(tài)的,也就意味著不應(yīng)使用sessions 或 cookies, 因此每個請求應(yīng)附帶某種授權(quán)憑證,因為用戶授權(quán)狀態(tài)可能沒通過sessions 或 cookies維護, 常用的做法是每個請求都發(fā)送一個秘密的access token來認證用戶,由于access token可以唯一識別和認證用戶,?API 請求應(yīng)通過HTTPS來防止man-in-the-middle (MitM) 中間人攻擊.

下面有幾種方式來發(fā)送access token:

  • HTTP 基本認證: access token 當(dāng)作用戶名發(fā)送,應(yīng)用在access token可安全存在API使用端的場景,例如,API使用端是運行在一臺服務(wù)器上的程序。
  • 請求參數(shù): access token 當(dāng)作API URL請求參數(shù)發(fā)送,例如?https://example.com/users?access-token=xxxxxxxx,由于大多數(shù)服務(wù)器都會保存請求參數(shù)到日志, 這種方式應(yīng)主要用于JSONP?請求,因為它不能使用HTTP頭來發(fā)送access token
  • OAuth 2: 使用者從認證服務(wù)器上獲取基于OAuth2協(xié)議的access token,然后通過?HTTP Bearer Tokens?發(fā)送到API 服務(wù)器。

Yii 支持上述的認證方式,你也可很方便的創(chuàng)建新的認證方式。

為你的APIs啟用認證,做以下步驟:

  1. 配置user?應(yīng)用組件:
    • 設(shè)置 yii\web\User::enableSession 屬性為?false.
    • 設(shè)置 yii\web\User::loginUrl 屬性為null?顯示一個HTTP 403 錯誤而不是跳轉(zhuǎn)到登錄界面.
  2. 在你的REST 控制器類中配置authenticator?行為來指定使用哪種認證方式
  3. 在你的yii\web\User::identityClass 類中實現(xiàn) yii\web\IdentityInterface::findIdentityByAccessToken() 方法.

步驟1不是必要的,但是推薦配置,因為RESTful APIs應(yīng)為無狀態(tài)的,當(dāng)yii\web\User::enableSession為false, 請求中的用戶認證狀態(tài)就不能通過session來保持,每個請求的認證通過步驟2和3來實現(xiàn)。

提示: 如果你將RESTful APIs作為應(yīng)用開發(fā),可以設(shè)置應(yīng)用配置中?user?組件的yii\web\User::enableSession, 如果將RESTful APIs作為模塊開發(fā),可以在模塊的?init()?方法中增加如下代碼,如下所示:

public function init()
{
    parent::init();
    \Yii::$app->user->enableSession = false;
}

例如,為使用HTTP Basic Auth,可配置authenticator?行為,如下所示:

use yii\filters\auth\HttpBasicAuth;

public function behaviors()
{
    $behaviors = parent::behaviors();
    $behaviors['authenticator'] = [
        'class' => HttpBasicAuth::className(),
    ];
    return $behaviors;
}

如果你系那個支持以上3個認證方式,可以使用CompositeAuth,如下所示:

use yii\filters\auth\CompositeAuth;
use yii\filters\auth\HttpBasicAuth;
use yii\filters\auth\HttpBearerAuth;
use yii\filters\auth\QueryParamAuth;

public function behaviors()
{
    $behaviors = parent::behaviors();
    $behaviors['authenticator'] = [
        'class' => CompositeAuth::className(),
        'authMethods' => [
            HttpBasicAuth::className(),
            HttpBearerAuth::className(),
            QueryParamAuth::className(),
        ],
    ];
    return $behaviors;
}

authMethods?中每個單元應(yīng)為一個認證方法名或配置數(shù)組。

findIdentityByAccessToken()方法的實現(xiàn)是系統(tǒng)定義的, 例如,一個簡單的場景,當(dāng)每個用戶只有一個access token, 可存儲access token 到user表的access_token列中, 方法可在User類中簡單實現(xiàn),如下所示:

use yii\db\ActiveRecord;
use yii\web\IdentityInterface;

class User extends ActiveRecord implements IdentityInterface
{
    public static function findIdentityByAccessToken($token, $type = null)
    {
        return static::findOne(['access_token' => $token]);
    }
}

在上述認證啟用后,對于每個API請求,請求控制器都會在它的beforeAction()步驟中對用戶進行認證。

如果認證成功,控制器再執(zhí)行其他檢查(如頻率限制,操作權(quán)限),然后再執(zhí)行操作, 授權(quán)用戶信息可使用Yii::$app->user->identity獲取.

如果認證失敗,會發(fā)送一個HTTP狀態(tài)碼為401的響應(yīng),并帶有其他相關(guān)信息頭(如HTTP 基本認證會有WWW-Authenticate?頭信息).

授權(quán)

在用戶認證成功后,你可能想要檢查他是否有權(quán)限執(zhí)行對應(yīng)的操作來獲取資源,這個過程稱為?authorization?, 詳情請參考Authorization section.

如果你的控制器從yii\rest\ActiveController類繼承,可覆蓋 yii\rest\Controller::checkAccess() 方法 來執(zhí)行授權(quán)檢查,該方法會被yii\rest\ActiveController內(nèi)置的操作調(diào)用。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號