成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Yii2.0 RESTful API 認證教程【令牌驗證】

X1nFLY / 1452人閱讀

摘要:最近在做認證功能,記錄整個過程,方便以后查看。請求參數(shù)當(dāng)作請求參數(shù)發(fā)送,例如,由于大多數(shù)服務(wù)器都會保存請求參數(shù)到日志,這種方式應(yīng)主要用于請求,因為它不能使用頭來發(fā)送使用者從認證服務(wù)器上獲取基于協(xié)議的,然后通過發(fā)送到服務(wù)器。

最近在做RESTful API認證功能,記錄整個過程,方便以后查看。本文參照了 https://segmentfault.com/a/1190000016368603部分內(nèi)容,感謝該作者的分享,以下內(nèi)容根據(jù)我的項目實際情況進行了調(diào)整。

認證介紹

和Web應(yīng)用不同,RESTful APIs 通常是無狀態(tài)的, 也就意味著不應(yīng)使用 sessionscookies, 因此每個請求應(yīng)附帶某種授權(quán)憑證,因為用戶授權(quán)狀態(tài)可能沒通過 sessionscookies 維護, 常用的做法是每個請求都發(fā)送一個秘密的 access token 來認證用戶, 由于 access token 可以唯一識別和認證用戶,API 請求應(yīng)通過 HTTPS 來防止man-in-the-middle (MitM) 中間人攻擊.

認證方式

HTTP 基本認證 :access token 當(dāng)作用戶名發(fā)送,應(yīng)用在access token可安全存在API使用端的場景, 例如,API使用端是運行在一臺服務(wù)器上的程序。

請求參數(shù): access token 當(dāng)作API URL請求參數(shù)發(fā)送,例如 https://example.com/users?acc..., 由于大多數(shù)服務(wù)器都會保存請求參數(shù)到日志, 這種方式應(yīng)主要用于JSONP 請求,因為它不能使用HTTP頭來發(fā)送 access token

OAuth 2 : 使用者從認證服務(wù)器上獲取基于 OAuth2 協(xié)議的 access token, 然后通過 HTTP Bearer Tokens 發(fā)送到 API 服務(wù)器。

上方進行簡單介紹,內(nèi)容來自 Yii Framework 2.0 權(quán)威指南

實現(xiàn)步驟

繼續(xù)上一篇 的內(nèi)容(這里暫時使用默認User數(shù)據(jù)表,正式環(huán)境請分離不同的數(shù)據(jù)表來進行認證)

需要添加的數(shù)據(jù)內(nèi)容

繼上篇的 User 數(shù)據(jù)表,我們還需要增加一 個 access_tokenexpire_at 的字段,

進入項目根目錄打開控制臺輸入以下命令:

./yii migrate/create add_column_access_token_to_user
./yii migrate/create add_column_expire_at_to_user

打開 你的項目目錄 /console/migrations/m181224_075747_add_column_access_token_user.php 修改如下內(nèi)容:

    public function up()
    {
        $ret = $this->db->createCommand("SELECT * FROM information_schema.columns WHERE table_schema = DATABASE()  AND table_name = "user" AND column_name = "access_token"")->queryOne();//判斷user表是否有"access_token"這個字段
        if (empty($ret)) {
            $this->addColumn("user", "access_token", $this->string(255)->defaultValue(NULL)->comment("令牌"));
        }
    }

    public function down()
    {
        $this->dropColumn("user", "access_token");
        return true;
    }

打開 你的項目目錄 /console/migrations/m181224_092333_add_column_expire_at_user.php 修改如下內(nèi)容:

    public function up()
    {
        $ret = $this->db->createCommand("SELECT * FROM information_schema.columns WHERE table_schema = DATABASE()  AND table_name = "user" AND column_name = "expire_at"")->queryOne();
        if (empty($ret)) {
            $this->addColumn("user", "expire_at", $this->integer(11)->defaultValue(NULL)->comment("令牌過期時間"));
        }
    }

    public function down()
    {
        $this->dropColumn("user", "expire_at");
        return true;
    }

執(zhí)行遷移命令

./yii migrate
配置

打開 apiconfigmain.php

配置 user 應(yīng)用組件:

"user" => [
            "identityClass" => "apimodelsUser",
            "enableAutoLogin" => true,
            "enableSession"=>false,
            //"identityCookie" => ["name" => "_identity-api", "httpOnly" => true],
        ],

將 session 組件注釋掉,或刪掉

//        "session" => [
//            // this is the name of the session cookie used for login on the backend
//            "name" => "advanced-api",
//        ],

編寫 apimodelsUser.php 實現(xiàn)認證類,繼承 IdentityInterface

commonmodelsUser 類拷貝到 apimodels 目錄下,修改命名空間為 apimodels


commonmodelsLoginForm.php 類拷貝到 apimodels* 目錄下,修改命名空間,并重寫 login* 方法:

validate()) {
            //return Yii::$app->user->login($this->getUser(), $this->rememberMe ? 3600 * 24 * 30 : 0);
            if ($this->getUser()) {
                $access_token = $this->_user->generateAccessToken();
                $this->_user->expire_at = time() + static::EXPIRE_TIME;
                $this->_user->save();
                Yii::$app->user->login($this->_user, static::EXPIRE_TIME);
                return $access_token;
            }
        }
        return false;
}

上方代碼給 User 模型添加了一個 generateAccessToken() 方法,因此我們到 apimodelsUser.php 中添加此方法

namespace apimodels;

use Yii;
use yiiaseNotSupportedException;
use yiiehaviorsTimestampBehavior;
use yiidbActiveRecord;
use yiiwebIdentityInterface;
use yiiwebUnauthorizedHttpException;
...
...
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;
    }
}

接下來在apicontrollers新加一個控制器 命名為 UserController 并繼承 yii estActiveController,編寫登錄 Login 方法,具體代碼如下:

namespace apicontrollers;
use apimodelsLoginForm;
use yii
estActiveController;
use yii;


class UserController extends ActiveController
{
    public $modelClass = "apimodelsUser";

    public function actions()
    {
        $action= parent::actions(); // TODO: Change the autogenerated stub
        unset($action["index"]);
        unset($action["create"]);
        unset($action["update"]);
        unset($action["delete"]);
    }

    public function actionIndex()
    {
        //你的代碼
    }

    /**
     * 登陸
     * @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",
            ],
        ],
    ],
]

使用一個調(diào)試工具來進行測試 http://youdomain/users/login 記住是POST 請求發(fā)送,假如用POSTMAN有問題的話指定一下 Content-Type:application/x-www-form-urlencoded 。
ok,不出意外的話,相信你已經(jīng)可以收到一個access_token 了,接下來就是如何使用這個token,如何維持認證狀態(tài),達到不攜帶這個token將無法訪問,返回 401

維持認證狀態(tài)

實現(xiàn)認證步驟:

在你的 REST 控制器類中配置 authenticator 行為來指定使用哪種認證方式

在你的 user identity class 類中實現(xiàn) yiiwebIdentityInterface::findIdentityByAccessToken() 方法.

具體實現(xiàn)方式如下:

打開之前的 User 控制器( apicontrollersUserController.php ),增加以下內(nèi)容:

use yiihelpersArrayHelper;
use yiifiltersauthQueryParamAuth;

...//此處省略一些代碼了

    public function behaviors()
    {
        return ArrayHelper::merge(parent::behaviors(), [
            "authenticatior" => [
                "class" => QueryParamAuth::className(), //實現(xiàn)access token認證
                "except" => ["login"], //無需驗證access token的方法,注意區(qū)分$noAclLogin
            ]
        ]);
    }
...    

實現(xiàn) findIdentityByAccessToken() 方法:

打開 apimodelsUser.php 重寫 findIdentityByAccessToken() 方法

...
use yiiwebUnauthorizedHttpException;
...

class User extends ActiveRecord implements IdentityInterface
{
    ...
    ...
    
    /**
     * {@inheritdoc}
     */
    public static function findIdentityByAccessToken($token, $type = null)
    {
//        throw new NotSupportedException(""findIdentityByAccessToken" is not implemented.");
        $user = static::find()->where(["access_token" => $token, "status" => self::STATUS_ACTIVE])->one();
        if (!$user) {
            return false;
        }
        if ($user->expire_at < time()) {
            throw new UnauthorizedHttpException("the access - token expired ", -1);
        } else {
            return $user;
        }
    }
    ...
}

打開 apicontrollersUserController.php ,增加 Test方法,用于測試令牌驗證

    public function actionTest()
    {
        return ["status"=>"success"];
    }

修改 apiconfigmain.php

        "urlManager" => [
            "enablePrettyUrl" => true,
            "enableStrictParsing" => true,
            "showScriptName" => false,
            "rules" => [
                ["class" => "yii
estUrlRule",
                    "controller" => "user",
                    //"pluralize" => false,    //設(shè)置為false 就可以去掉復(fù)數(shù)形式了
                    "extraPatterns"=>[
                        "GET test"=>"test",
                        "POST login"=>"login",
                    ],
                ],
            ],
        ]

接下來訪問一下你的域名 http://youdomain/users/test,不攜帶任何參數(shù)是不是返回 401了?
ok,這里介紹兩種訪問方式,一種是URL訪問,另一種是通過header 來進行攜帶

http://youdomain/users/test?a...

傳遞 header 頭信息

Authorization:Bearer YYdpiZna0hJGhjsfqwxUeHEgLDfHEjB-

注意 Bearer 和你的token中間是有 一個空格的,很多同學(xué)在這個上面碰了很多次
以上就是基于YII2.0 RESTful 認證的內(nèi)容。

本文參照了 https://segmentfault.com/a/1190000016368603部分內(nèi)容,感謝該作者的分享,以上內(nèi)容根據(jù)我的項目實際情況進行了調(diào)整。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/29855.html

相關(guān)文章

  • Yii2.0 RESTful API 之速率限制

    摘要:之速率限制什么是速率限制權(quán)威指南翻譯過來為限流,為防止濫用,你應(yīng)該考慮對您的限流。如果在規(guī)定的時間內(nèi)接收了一個用戶大量的請求,將返回響應(yīng)狀態(tài)代碼這意味著過多的請求。 Yii2.0 RESTful API 之速率限制 什么是速率限制? 權(quán)威指南翻譯過來為限流,為防止濫用,你應(yīng)該考慮對您的 API 限流。 例如,您可以限制每個用戶 10 分鐘內(nèi)最多調(diào)用 API 100 次。 如果在規(guī)定的時...

    LeviDing 評論0 收藏0
  • Yii2.0 RESTful API 認證教程

    摘要:請求參數(shù)當(dāng)作請求參數(shù)發(fā)送,例如,由于大多數(shù)服務(wù)器都會保存請求參數(shù)到日志,這種方式應(yīng)主要用于請求,因為它不能使用頭來發(fā)送使用者從認證服務(wù)器上獲取基于協(xié)議的,然后通過發(fā)送到服務(wù)器。 認證介紹 和Web應(yīng)用不同,RESTful APIs 通常是無狀態(tài)的, 也就意味著不應(yīng)使用 sessions 或 cookies, 因此每個請求應(yīng)附帶某種授權(quán)憑證,因為用戶授權(quán)狀態(tài)可能沒通過 sessions ...

    JohnLui 評論0 收藏0
  • 使用 Laravel Passport 為你的 REST API 增加用戶認證功能

    摘要:在本教程中,我們將了解如何在應(yīng)用中使用認證。當(dāng)用戶通過登錄時,會生成令牌并將其發(fā)送給用戶,該用戶可用于身份驗證。提供,可以毫無困難地使用認證。服務(wù)提供者我們使用的最新版本,它可以使用包發(fā)現(xiàn)并自動注冊服務(wù)。 showImg(https://segmentfault.com/img/remote/1460000019095408?w=1000&h=526); 在本教程中,我們將了解如何在 ...

    mudiyouyou 評論0 收藏0
  • Yii2.0 RESTful API 之版本控制

    摘要:之版本控制之前我寫過兩篇關(guān)于如何搭建,以及認證等處理,但是沒有涉及到版本管理,今天就來談?wù)劙姹竟芾砣绾螌崿F(xiàn)。如果你還沒有安裝,你可以按照這里的說明進行安裝。 Yii2.0 RESTful API 之版本控制 之前我寫過兩篇關(guān)于 Yii2.0 RESTful API 如何搭建,以及 認證 等處理,但是沒有涉及到版本管理,今天就來談?wù)劙姹竟芾砣绾螌崿F(xiàn)。 索性就從頭開始一步一步搭建吧,但是關(guān)...

    _ang 評論0 收藏0
  • PHP / Laravel API 開發(fā)推薦閱讀清單

    showImg(https://segmentfault.com/img/bV6aHV?w=1280&h=800); 社區(qū)優(yōu)秀文章 Laravel 5.5+passport 放棄 dingo 開發(fā) API 實戰(zhàn),讓 API 開發(fā)更省心 - 自造車輪。 API 文檔神器 Swagger 介紹及在 PHP 項目中使用 - API 文檔撰寫方案 推薦 Laravel API 項目必須使用的 8 個...

    shmily 評論0 收藏0

發(fā)表評論

0條評論

X1nFLY

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<