成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

Yii2.0 RESTful API 認(rèn)證教程

JohnLui / 2956人閱讀

摘要:請(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)使用 sessionscookies, 因此每個(gè)請(qǐng)求應(yīng)附帶某種授權(quán)憑證,因?yàn)橛脩羰跈?quán)狀態(tài)可能沒通過 sessionscookies 維護(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.phpcomponents數(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

相關(guān)文章

  • Yii2.0 RESTful API 之速率限制

    摘要:之速率限制什么是速率限制權(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í)...

    LeviDing 評(píng)論0 收藏0
  • Yii2.0 RESTful API 認(rèn)證教程【令牌驗(yàn)證】

    摘要:最近在做認(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...

    X1nFLY 評(píng)論0 收藏0
  • Yii2.0 RESTful API 之版本控制

    摘要:之版本控制之前我寫過兩篇關(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)...

    _ang 評(píng)論0 收藏0
  • Yii2.0 RESTful API 基礎(chǔ)配置教程[轉(zhuǎ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...

    xorpay 評(píng)論0 收藏0
  • Yii2.0 RESTful API 基礎(chǔ)配置教程

    這篇說下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...

    fyber 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<