摘要:請(qǐng)求參數(shù)當(dāng)作請(qǐng)求參數(shù)發(fā)送,例如,由于大多數(shù)服務(wù)器都會(huì)保存請(qǐng)求參數(shù)到日志,這種方式應(yīng)主要用于請(qǐng)求,因?yàn)樗荒苁褂妙^來發(fā)送使用者從認(rèn)證服務(wù)器上獲取基于協(xié)議的,然后通過發(fā)送到服務(wù)器。
認(rèn)證介紹
和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) 中間人攻擊.
認(rèn)證方式HTTP 基本認(rèn)證 :access token 當(dāng)作用戶名發(fā)送,應(yīng)用在access token可安全存在API使用端的場(chǎng)景, 例如,API使用端是運(yùn)行在一臺(tái)服務(wù)器上的程序。
請(qǐng)求參數(shù): access token 當(dāng)作API URL請(qǐng)求參數(shù)發(fā)送,例如 https://example.com/users?access-token=xxxxxxxx, 由于大多數(shù)服務(wù)器都會(huì)保存請(qǐng)求參數(shù)到日志, 這種方式應(yīng)主要用于JSONP 請(qǐng)求,因?yàn)樗荒苁褂肏TTP頭來發(fā)送 access token
OAuth 2 : 使用者從認(rèn)證服務(wù)器上獲取基于 OAuth2 協(xié)議的 access token, 然后通過 HTTP Bearer Tokens 發(fā)送到 API 服務(wù)器。
上方進(jìn)行簡單介紹,內(nèi)容來自 Yii Framework 2.0 權(quán)威指南
實(shí)現(xiàn)步驟我們都知道 Yii2.0 默認(rèn)的認(rèn)證類都是 User,前后臺(tái)都是共用一個(gè)認(rèn)證類,因此我們要把API 認(rèn)證類 多帶帶分離出來,達(dá)到前、后、API都分離,
繼上一章:(這里暫時(shí)使用默認(rèn)User數(shù)據(jù)表,正式環(huán)境請(qǐng)分離不同的數(shù)據(jù)表來進(jìn)行認(rèn)證)
準(zhǔn)備條件
繼上篇的 User 數(shù)據(jù)表,我們還需要增加一 個(gè)access_token 的字段,
直接在你的數(shù)據(jù)庫中新增 access_token 字段。
使用數(shù)據(jù)遷移的方式
進(jìn)入項(xiàng)目根目錄打開控制臺(tái)輸入以下命令:
php yii migrate/create add_access_token_to_user
打開 你的項(xiàng)目目錄/console/migrations/m180704_054630_add_access_token_to_user.php 修改如下內(nèi)容:
public function safeUp() { $this->addColumn("user", "access_token", $this->string()); } public function safeDown() { $this->dropColumn("user", "access_token"); }
執(zhí)行遷移命令
php yii migrate
瀏覽器打開前臺(tái)目錄 frontend 頁面,點(diǎn)擊注冊(cè)賬號(hào),先注冊(cè)一個(gè)賬號(hào)配置
打開 apiconfigmain.php
配置 user 應(yīng)用組件:* 設(shè)置 `identityClass` 屬性為哪個(gè)認(rèn)證類 * 設(shè)置 `enableSession` 屬性為 `false` * 設(shè)置 `enableAutoLogin` 屬性為 `true`將 session 組件注釋掉,或刪掉
"user" => [ "identityClass" => "apimodelsUser", "enableAutoLogin" => true, "enableSession"=>false, //"identityCookie" => ["name" => "_identity-backend", "httpOnly" => true], ], //"session" => [ // this is the name of the session cookie used for login on the backend // "name" => "advanced-backend", // ],編寫 apimodelsUser.php 實(shí)現(xiàn)認(rèn)證類,繼承 IdentityInterface
將 commonmodelsUser 類拷貝到 apimodels目錄下,修改命名空間為apimodels
將 commonmodelsLoginForm.php 類拷貝到apimodels目錄下,修改命名空間,并重寫login方法:validate()) { $access_token=$this->_user->generateAccessToken(); $this->_user->save(); return $access_token; } else { return false; } }上方代碼給User模型添加了一個(gè)generateAccessToken()方法,因此我們到apimodelsUser.php中添加此方法namespace apimodels; use Yii; use yiiaseNotSupportedException; use yiiehaviorsTimestampBehavior; use yiidbActiveRecord; use yiiwebIdentityInterface; ... ... class User extends ActiveRecord implements IdentityInterface { ... ... /** * 生成accessToken字符串 * @return string * @throws yiiaseException */ public function generateAccessToken() { $this->access_token=Yii::$app->security->generateRandomString(); return $this->access_token; } }接下來打開 之前的User 控制器編寫登錄方法use apimodelsLoginForm; ... ... //省略一些代碼 /** * 登陸 * @return array * @throws yiiaseException * @throws yiiaseInvalidConfigException */ public function actionLogin() { $model = new LoginForm(); if ($model->load(Yii::$app->getRequest()->getBodyParams(), "") && $model->login()) { return [ "access_token" => $model->login(), ]; } else { return $model->getFirstErrors(); } } ...最后新增一條URL規(guī)則打開 apiconfigmain.php 修改 components屬性,添加下列代碼:
"urlManager" => [ "enablePrettyUrl" => true, "enableStrictParsing" => true, "showScriptName" => false, "rules" => [ ["class" => "yii estUrlRule", "controller" => "user", "extraPatterns"=>[ "POST login"=>"login", ], ], ], ]使用一個(gè)調(diào)試工具來進(jìn)行測(cè)試 http://youdomain/users/login 記住是POST 請(qǐng)求發(fā)送,假如用POSTMAN有問題的話指定一下 Content-Type:application/x-www-form-urlencoded。ok,不出意外的話,相信你已經(jīng)可以收到一個(gè)access_token了,接下來就是如何使用這個(gè)token,如何維持認(rèn)證狀態(tài),達(dá)到不攜帶這個(gè)token將無法訪問,返回401
維持認(rèn)證狀態(tài)實(shí)現(xiàn)認(rèn)證只需兩步:
在你的 REST 控制器類中配置 authenticator 行為來指定使用哪種認(rèn)證方式
在你的 user identity class 類中實(shí)現(xiàn) yiiwebIdentityInterface::findIdentityByAccessToken()-detail) 方法.
接下來我們圍繞這兩步來實(shí)現(xiàn):
添加一個(gè)REST控制器因我這里暫未設(shè)計(jì)其他數(shù)據(jù)表 所以我們暫且還使用User 數(shù)據(jù)表吧
在apicontrollers新加一個(gè)控制器 命名為 ArticleController 并繼承 yii estActiveController,配置認(rèn)證方式代碼:代碼如下:
CompositeAuth::className(), "authMethods" => [ HttpBasicAuth::className(), HttpBearerAuth::className(), QueryParamAuth::className(), ], ]; return $behaviors; } }注意:這個(gè)控制器并非真正的Article,實(shí)則還是User實(shí)現(xiàn) findIdentityByAccessToken() 方法:
打開 apimodelsUser.php 重寫 findIdentityByAccessToken() 方法
... ... class User extends ActiveRecord implements IdentityInterface { ... ... public static function findIdentityByAccessToken($token, $type = null) { return static::findOne(["access_token" => $token]); } ... }為剛才新加的控制器添加路由規(guī)則(ps:好像多了一步......)
修改 apiconfigmain.php
"urlManager" => [ "enablePrettyUrl" => true, "enableStrictParsing" => true, "showScriptName" => false, "rules" => [ ["class" => "yii estUrlRule", "controller" => "user", "extraPatterns"=>[ "GET send-email"=>"send-email" "POST login"=>"login", ], ], ["class" => "yii estUrlRule", "controller" => "article", "extraPatterns"=>[ ], ], ], ]接下來訪問一下你的域名 http://youdomain/articles,不攜帶任何參數(shù)是不是返回 401了?
ok,這里介紹兩種訪問方式,一種是URL訪問,另一種是通過header 來進(jìn)行攜帶
http://youdomain/articles?acc...
傳遞 header頭信息
Authorization:Bearer y3XWtwWaxqCEBDoE-qzZk0bCp3UKO920注意 Bearer 和你的token中間是有 一個(gè)空格的,很多同學(xué)在這個(gè)上面碰了很多次好啦,基于YII2.0 RESTful 認(rèn)證就此結(jié)束了,
更過完整的功能 請(qǐng)移步官方文檔
授權(quán)驗(yàn)證
另外還有速率驗(yàn)證,就自行發(fā)覺吧
另外,如果看不懂,或者寫的不好,請(qǐng)移步 魏曦 老師的視頻教程,本人所有內(nèi)容都是跟隨 魏曦老師 學(xué)的
魏曦教你學(xué)寫完認(rèn)證發(fā)現(xiàn)我們的接口返回的數(shù)據(jù)不是很直觀,現(xiàn)實(shí)生活中通常也不是這樣子的,我們可能會(huì)返回一些特定的格式
自定義響應(yīng)內(nèi)容打開 apiconfigmain.php 在 components數(shù)組里面添加如下內(nèi)容分
"response" => [ "class" => "yiiwebResponse", "on beforeSend" => function ($event) { $response = $event->sender; $response->data = [ "success" => $response->isSuccessful, "code" => $response->getStatusCode(), "message" => $response->statusText, "data" => $response->data, ]; $response->statusCode = 200; }, ],這里的狀態(tài)碼統(tǒng)一設(shè)為 200 ,具體的可另行配置,假如登陸操作 密碼錯(cuò)誤或者其他,我們可以在控制器中這樣使用:
$response = Yii::$app->response; $response->setStatusCode(422); return [ "errmsg" => "用戶名或密碼錯(cuò)誤!" ];水平有限,難免有紕漏,請(qǐng)不吝賜教,在下會(huì)感激不盡
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/30848.html
摘要:之速率限制什么是速率限制權(quán)威指南翻譯過來為限流,為防止濫用,你應(yīng)該考慮對(duì)您的限流。如果在規(guī)定的時(shí)間內(nèi)接收了一個(gè)用戶大量的請(qǐng)求,將返回響應(yīng)狀態(tài)代碼這意味著過多的請(qǐng)求。 Yii2.0 RESTful API 之速率限制 什么是速率限制? 權(quán)威指南翻譯過來為限流,為防止濫用,你應(yīng)該考慮對(duì)您的 API 限流。 例如,您可以限制每個(gè)用戶 10 分鐘內(nèi)最多調(diào)用 API 100 次。 如果在規(guī)定的時(shí)...
摘要:最近在做認(rèn)證功能,記錄整個(gè)過程,方便以后查看。請(qǐng)求參數(shù)當(dāng)作請(qǐng)求參數(shù)發(fā)送,例如,由于大多數(shù)服務(wù)器都會(huì)保存請(qǐng)求參數(shù)到日志,這種方式應(yīng)主要用于請(qǐng)求,因?yàn)樗荒苁褂妙^來發(fā)送使用者從認(rèn)證服務(wù)器上獲取基于協(xié)議的,然后通過發(fā)送到服務(wù)器。 最近在做RESTful API認(rèn)證功能,記錄整個(gè)過程,方便以后查看。本文參照了 https://segmentfault.com/a/119000001636860...
摘要:之版本控制之前我寫過兩篇關(guān)于如何搭建,以及認(rèn)證等處理,但是沒有涉及到版本管理,今天就來談?wù)劙姹竟芾砣绾螌?shí)現(xiàn)。如果你還沒有安裝,你可以按照這里的說明進(jìn)行安裝。 Yii2.0 RESTful API 之版本控制 之前我寫過兩篇關(guān)于 Yii2.0 RESTful API 如何搭建,以及 認(rèn)證 等處理,但是沒有涉及到版本管理,今天就來談?wù)劙姹竟芾砣绾螌?shí)現(xiàn)。 索性就從頭開始一步一步搭建吧,但是關(guān)...
摘要:最近在做功能,找了好久的資料,才找到這類的教程,感謝該作者,以下內(nèi)容根據(jù)我的項(xiàng)目實(shí)際情況做了一定的修改。 最近在做Yii2.0 RESTful API功能,找了好久的資料,才找到這類的教程,感謝該作者,以下內(nèi)容根據(jù)我的項(xiàng)目實(shí)際情況做了一定的修改。 安裝yii2.0 安裝 Composer 后,您可以通過在 Web 可訪問的文件夾下運(yùn)行以下命令來 安裝Yii應(yīng)用程序模板: compose...
這篇說下yii2.0開發(fā) API 吧,使用 RESTful API模式 安裝Yii2.0 通過 Composer 安裝 這是安裝Yii2.0的首選方法。如果你還沒有安裝 Composer,你可以按照這里的說明進(jìn)行安裝。 安裝完 Composer,運(yùn)行下面的命令來安裝 Composer Asset 插件: php composer.phar global require fxp/composer-a...
閱讀 665·2023-04-26 02:58
閱讀 2387·2021-09-27 14:01
閱讀 3688·2021-09-22 15:57
閱讀 1271·2019-08-30 15:56
閱讀 1106·2019-08-30 15:53
閱讀 864·2019-08-30 15:52
閱讀 794·2019-08-26 14:01
閱讀 2237·2019-08-26 13:41