摘要:請求參數當作請求參數發送,例如,由于大多數服務器都會保存請求參數到日志,這種方式應主要用于請求,因為它不能使用頭來發送使用者從認證服務器上獲取基于協議的,然后通過發送到服務器。
認證介紹
和Web應用不同,RESTful APIs 通常是無狀態的, 也就意味著不應使用 sessions 或 cookies, 因此每個請求應附帶某種授權憑證,因為用戶授權狀態可能沒通過 sessions 或 cookies 維護, 常用的做法是每個請求都發送一個秘密的 access token 來認證用戶, 由于 access token 可以唯一識別和認證用戶,API 請求應通過 HTTPS 來防止man-in-the-middle (MitM) 中間人攻擊.
認證方式HTTP 基本認證 :access token 當作用戶名發送,應用在access token可安全存在API使用端的場景, 例如,API使用端是運行在一臺服務器上的程序。
請求參數: access token 當作API URL請求參數發送,例如 https://example.com/users?access-token=xxxxxxxx, 由于大多數服務器都會保存請求參數到日志, 這種方式應主要用于JSONP 請求,因為它不能使用HTTP頭來發送 access token
OAuth 2 : 使用者從認證服務器上獲取基于 OAuth2 協議的 access token, 然后通過 HTTP Bearer Tokens 發送到 API 服務器。
上方進行簡單介紹,內容來自 Yii Framework 2.0 權威指南
實現步驟我們都知道 Yii2.0 默認的認證類都是 User,前后臺都是共用一個認證類,因此我們要把API 認證類 多帶帶分離出來,達到前、后、API都分離,
繼上一章:(這里暫時使用默認User數據表,正式環境請分離不同的數據表來進行認證)
準備條件
繼上篇的 User 數據表,我們還需要增加一 個access_token 的字段,
直接在你的數據庫中新增 access_token 字段。
使用數據遷移的方式
進入項目根目錄打開控制臺輸入以下命令:
php yii migrate/create add_access_token_to_user
打開 你的項目目錄/console/migrations/m180704_054630_add_access_token_to_user.php 修改如下內容:
public function safeUp() { $this->addColumn("user", "access_token", $this->string()); } public function safeDown() { $this->dropColumn("user", "access_token"); }
執行遷移命令
php yii migrate
瀏覽器打開前臺目錄 frontend 頁面,點擊注冊賬號,先注冊一個賬號配置
打開 apiconfigmain.php
配置 user 應用組件:* 設置 `identityClass` 屬性為哪個認證類 * 設置 `enableSession` 屬性為 `false` * 設置 `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 實現認證類,繼承 IdentityInterface
將 commonmodelsUser 類拷貝到 apimodels目錄下,修改命名空間為apimodels
將 commonmodelsLoginForm.php 類拷貝到apimodels目錄下,修改命名空間,并重寫login方法:validate()) { $access_token=$this->_user->generateAccessToken(); $this->_user->save(); return $access_token; } else { return false; } }上方代碼給User模型添加了一個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規則打開 apiconfigmain.php 修改 components屬性,添加下列代碼:
"urlManager" => [ "enablePrettyUrl" => true, "enableStrictParsing" => true, "showScriptName" => false, "rules" => [ ["class" => "yii estUrlRule", "controller" => "user", "extraPatterns"=>[ "POST login"=>"login", ], ], ], ]使用一個調試工具來進行測試 http://youdomain/users/login 記住是POST 請求發送,假如用POSTMAN有問題的話指定一下 Content-Type:application/x-www-form-urlencoded。ok,不出意外的話,相信你已經可以收到一個access_token了,接下來就是如何使用這個token,如何維持認證狀態,達到不攜帶這個token將無法訪問,返回401
維持認證狀態實現認證只需兩步:
在你的 REST 控制器類中配置 authenticator 行為來指定使用哪種認證方式
在你的 user identity class 類中實現 yiiwebIdentityInterface::findIdentityByAccessToken()-detail) 方法.
接下來我們圍繞這兩步來實現:
添加一個REST控制器因我這里暫未設計其他數據表 所以我們暫且還使用User 數據表吧
在apicontrollers新加一個控制器 命名為 ArticleController 并繼承 yii estActiveController,配置認證方式代碼:代碼如下:
CompositeAuth::className(), "authMethods" => [ HttpBasicAuth::className(), HttpBearerAuth::className(), QueryParamAuth::className(), ], ]; return $behaviors; } }注意:這個控制器并非真正的Article,實則還是User實現 findIdentityByAccessToken() 方法:
打開 apimodelsUser.php 重寫 findIdentityByAccessToken() 方法
... ... class User extends ActiveRecord implements IdentityInterface { ... ... public static function findIdentityByAccessToken($token, $type = null) { return static::findOne(["access_token" => $token]); } ... }為剛才新加的控制器添加路由規則(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,不攜帶任何參數是不是返回 401了?
ok,這里介紹兩種訪問方式,一種是URL訪問,另一種是通過header 來進行攜帶
http://youdomain/articles?acc...
傳遞 header頭信息
Authorization:Bearer y3XWtwWaxqCEBDoE-qzZk0bCp3UKO920注意 Bearer 和你的token中間是有 一個空格的,很多同學在這個上面碰了很多次好啦,基于YII2.0 RESTful 認證就此結束了,
更過完整的功能 請移步官方文檔
授權驗證
另外還有速率驗證,就自行發覺吧
另外,如果看不懂,或者寫的不好,請移步 魏曦 老師的視頻教程,本人所有內容都是跟隨 魏曦老師 學的
魏曦教你學寫完認證發現我們的接口返回的數據不是很直觀,現實生活中通常也不是這樣子的,我們可能會返回一些特定的格式
自定義響應內容打開 apiconfigmain.php 在 components數組里面添加如下內容分
"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; }, ],這里的狀態碼統一設為 200 ,具體的可另行配置,假如登陸操作 密碼錯誤或者其他,我們可以在控制器中這樣使用:
$response = Yii::$app->response; $response->setStatusCode(422); return [ "errmsg" => "用戶名或密碼錯誤!" ];水平有限,難免有紕漏,請不吝賜教,在下會感激不盡
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/30848.html
摘要:之速率限制什么是速率限制權威指南翻譯過來為限流,為防止濫用,你應該考慮對您的限流。如果在規定的時間內接收了一個用戶大量的請求,將返回響應狀態代碼這意味著過多的請求。 Yii2.0 RESTful API 之速率限制 什么是速率限制? 權威指南翻譯過來為限流,為防止濫用,你應該考慮對您的 API 限流。 例如,您可以限制每個用戶 10 分鐘內最多調用 API 100 次。 如果在規定的時...
摘要:最近在做認證功能,記錄整個過程,方便以后查看。請求參數當作請求參數發送,例如,由于大多數服務器都會保存請求參數到日志,這種方式應主要用于請求,因為它不能使用頭來發送使用者從認證服務器上獲取基于協議的,然后通過發送到服務器。 最近在做RESTful API認證功能,記錄整個過程,方便以后查看。本文參照了 https://segmentfault.com/a/119000001636860...
摘要:之版本控制之前我寫過兩篇關于如何搭建,以及認證等處理,但是沒有涉及到版本管理,今天就來談談版本管理如何實現。如果你還沒有安裝,你可以按照這里的說明進行安裝。 Yii2.0 RESTful API 之版本控制 之前我寫過兩篇關于 Yii2.0 RESTful API 如何搭建,以及 認證 等處理,但是沒有涉及到版本管理,今天就來談談版本管理如何實現。 索性就從頭開始一步一步搭建吧,但是關...
摘要:最近在做功能,找了好久的資料,才找到這類的教程,感謝該作者,以下內容根據我的項目實際情況做了一定的修改。 最近在做Yii2.0 RESTful API功能,找了好久的資料,才找到這類的教程,感謝該作者,以下內容根據我的項目實際情況做了一定的修改。 安裝yii2.0 安裝 Composer 后,您可以通過在 Web 可訪問的文件夾下運行以下命令來 安裝Yii應用程序模板: compose...
這篇說下yii2.0開發 API 吧,使用 RESTful API模式 安裝Yii2.0 通過 Composer 安裝 這是安裝Yii2.0的首選方法。如果你還沒有安裝 Composer,你可以按照這里的說明進行安裝。 安裝完 Composer,運行下面的命令來安裝 Composer Asset 插件: php composer.phar global require fxp/composer-a...
閱讀 568·2023-04-26 02:58
閱讀 2307·2021-09-27 14:01
閱讀 3608·2021-09-22 15:57
閱讀 1172·2019-08-30 15:56
閱讀 1047·2019-08-30 15:53
閱讀 792·2019-08-30 15:52
閱讀 648·2019-08-26 14:01
閱讀 2165·2019-08-26 13:41