W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
入門(Getting Started)?應(yīng)用結(jié)構(gòu)(Application Structure)?請(qǐng)求處理(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)驗(yàn)證(Authentication)速率限制(Rate Limiting)版本化(Versioning)錯(cuò)誤處理(Error Handling)
開發(fā)工具(Development Tools)?測(cè)試(Testing)?高級(jí)專題(Special Topics)?小部件(Widgets)?助手類(Helpers)?
和Web應(yīng)用不同,RESTful APIs 通常是無狀態(tài)的,也就意味著不應(yīng)使用sessions 或 cookies, 因此每個(gè)請(qǐng)求應(yīng)附帶某種授權(quán)憑證,因?yàn)橛脩羰跈?quán)狀態(tài)可能沒通過sessions 或 cookies維護(hù), 常用的做法是每個(gè)請(qǐng)求都發(fā)送一個(gè)秘密的access token來認(rèn)證用戶,由于access token可以唯一識(shí)別和認(rèn)證用戶,?API 請(qǐng)求應(yīng)通過HTTPS來防止man-in-the-middle (MitM) 中間人攻擊.
下面有幾種方式來發(fā)送access token:
https://example.com/users?access-token=xxxxxxxx
,由于大多數(shù)服務(wù)器都會(huì)保存請(qǐng)求參數(shù)到日志, 這種方式應(yīng)主要用于JSONP
?請(qǐng)求,因?yàn)樗荒苁褂肏TTP頭來發(fā)送access tokenYii 支持上述的認(rèn)證方式,你也可很方便的創(chuàng)建新的認(rèn)證方式。
為你的APIs啟用認(rèn)證,做以下步驟:
user
?應(yīng)用組件:
false
.null
?顯示一個(gè)HTTP 403 錯(cuò)誤而不是跳轉(zhuǎn)到登錄界面.authenticator
?行為來指定使用哪種認(rèn)證方式步驟1不是必要的,但是推薦配置,因?yàn)镽ESTful APIs應(yīng)為無狀態(tài)的,當(dāng)yii\web\User::enableSession為false, 請(qǐng)求中的用戶認(rèn)證狀態(tài)就不能通過session來保持,每個(gè)請(qǐng)求的認(rèn)證通過步驟2和3來實(shí)現(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;
}
如果你系那個(gè)支持以上3個(gè)認(rèn)證方式,可以使用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
?中每個(gè)單元應(yīng)為一個(gè)認(rèn)證方法名或配置數(shù)組。
findIdentityByAccessToken()
方法的實(shí)現(xiàn)是系統(tǒng)定義的, 例如,一個(gè)簡(jiǎn)單的場(chǎng)景,當(dāng)每個(gè)用戶只有一個(gè)access token, 可存儲(chǔ)access token 到user表的access_token
列中, 方法可在User
類中簡(jiǎn)單實(shí)現(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]);
}
}
在上述認(rèn)證啟用后,對(duì)于每個(gè)API請(qǐng)求,請(qǐng)求控制器都會(huì)在它的beforeAction()
步驟中對(duì)用戶進(jìn)行認(rèn)證。
如果認(rèn)證成功,控制器再執(zhí)行其他檢查(如頻率限制,操作權(quán)限),然后再執(zhí)行操作, 授權(quán)用戶信息可使用Yii::$app->user->identity
獲取.
如果認(rèn)證失敗,會(huì)發(fā)送一個(gè)HTTP狀態(tài)碼為401的響應(yīng),并帶有其他相關(guān)信息頭(如HTTP 基本認(rèn)證會(huì)有WWW-Authenticate
?頭信息).
在用戶認(rèn)證成功后,你可能想要檢查他是否有權(quán)限執(zhí)行對(duì)應(yīng)的操作來獲取資源,這個(gè)過程稱為?authorization?, 詳情請(qǐng)參考Authorization section.
如果你的控制器從yii\rest\ActiveController類繼承,可覆蓋 yii\rest\Controller::checkAccess() 方法 來執(zhí)行授權(quán)檢查,該方法會(huì)被yii\rest\ActiveController內(nèi)置的操作調(diào)用。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: