?
このドキュメントでは、 php中國語ネットマニュアル リリース
和Web應用不同,RESTful APIs 通常是無狀態(tài)的,也就意味著不應使用sessions 或 cookies, 因此每個請求應附帶某種授權憑證,因為用戶授權狀態(tài)可能沒通過sessions 或 cookies維護, 常用的做法是每個請求都發(fā)送一個秘密的access token來認證用戶,由于access token可以唯一識別和認證用戶,?API 請求應通過HTTPS來防止man-in-the-middle (MitM) 中間人攻擊.
下面有幾種方式來發(fā)送access token:
https://example.com/users?access-token=xxxxxxxx
,由于大多數(shù)服務器都會保存請求參數(shù)到日志, 這種方式應主要用于JSONP
?請求,因為它不能使用HTTP頭來發(fā)送access tokenYii 支持上述的認證方式,你也可很方便的創(chuàng)建新的認證方式。
為你的APIs啟用認證,做以下步驟:
user
?應用組件:
false
.null
?顯示一個HTTP 403 錯誤而不是跳轉(zhuǎn)到登錄界面.authenticator
?行為來指定使用哪種認證方式步驟1不是必要的,但是推薦配置,因為RESTful APIs應為無狀態(tài)的,當yii\web\User::enableSession為false, 請求中的用戶認證狀態(tài)就不能通過session來保持,每個請求的認證通過步驟2和3來實現(xiàn)。
提示: 如果你將RESTful APIs作為應用開發(fā),可以設置應用配置中?
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
?中每個單元應為一個認證方法名或配置數(shù)組。
findIdentityByAccessToken()
方法的實現(xiàn)是系統(tǒ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í)行其他檢查(如頻率限制,操作權限),然后再執(zhí)行操作, 授權用戶信息可使用Yii::$app->user->identity
獲取.
如果認證失敗,會發(fā)送一個HTTP狀態(tài)碼為401的響應,并帶有其他相關信息頭(如HTTP 基本認證會有WWW-Authenticate
?頭信息).
在用戶認證成功后,你可能想要檢查他是否有權限執(zhí)行對應的操作來獲取資源,這個過程稱為?authorization?, 詳情請參考?Authorization section.