加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

yii2项目拭魅战之restful api授权验证详解

发布时间:2021-01-17 23:22:58 所属栏目:编程 来源:网络整理
导读:媒介 什么是restful气魄威风凛凛的api呢?我们之前有写过来先容其观念以及根基操纵。 既然写过了,那本日是要说点什么吗? 这篇文章首要针对现实场景中api的陈设来写。 我们本日就来大大的侃侃那些年api碰着的授权验证题目!独家干活,假如看完有所受益,记得不要忘

/**

  • 按照用户名获取用户的认证信息
  • @return User|null
    */
    protected function getUser()
    {
    if ($this->_user === null) {
    $this->_user = User::findByUsername($this->username);
    }

return $this->_user;
}

/**

  • 登录校验乐成后,为用户天生新的token
  • 假如token失效,则从头天生token
    */
    public function onGenerateApiToken ()
    {
    if (!User::apiTokenIsValid($this->_user->api_token)) {
    $this->_user->generateApiToken();
    $this->_user->save(false);
    }
    }
    }

    我们回过甚来看一下,当我们在UserController的login操纵中挪用LoginForm的login操纵后都产生了什么

    1、挪用LoginForm的login要领

    2、挪用validate要领,随后对rules举办校验

    3、rules校验中挪用validatePassword要领,对用户名和暗码举办校验

    4、validatePassword要领校验的进程中挪用LoginForm的getUser要领,通过commonmodelsUser类的findByUsername获取用户,找不到可能commonmodelsUser的validatePassword对暗码校验失败则返回error

    5、触发LoginForm::GENERATE_API_TOKEN变乱,挪用LoginForm的onGenerateApiToken要领,通过commonmodelsUser的apiTokenIsValid校验token的有用性,假如无效,则挪用User的generateApiToken要领从头天生

    留意:commonmodelsUser类必需是用户的认证类,假如不知道怎样建设完美该类,请围观这里 用户打点之user组件的设置

    下面增补本节增进的commonmodelsUser的相干要领

  • 天生 api_token
    */
    public function generateApiToken()
    {
    $this->apitoken = Yii::$app->security->generateRandomString() . '' . time();
    }

/**

  • 校验api_token是否有用
    */
    public static function apiTokenIsValid($token)
    {
    if (empty($token)) {
    return false;
    }

$timestamp = (int) substr($token,strrpos($token,'_') + 1);
$expire = Yii::$app->params['user.apiTokenExpire'];
return $timestamp + $expire >= time();
}

继承增补apiTokenIsValid要领中涉及到的token有用期,在apiconfigparams.php文件内增进即可

1*24*3600,];

到这里呢,客户端登录 处事端返回token给客户端就完成了。

凭证文中一开始的说明,客户端应该把获取到的token存到当地,好比cookie中。往后再必要token校验的接口会见中,从当地读取好比从cookie中读取并会见接口即可。

按照token哀求用户的认证操纵

假设我们已经把获取到的token生涯起来了,我们再以会见用户信息的接口为例。

yiifiltersauthQueryParamAuth类认定的token参数是 access-token,我们可以在举动中修改下

[ 'class' => QueryParamAuth::className(),'tokenParam' => 'token','optional' => [ 'login','signup-test' ],] ] ); }

这里将默认的access-token修改为token。

我们在设置文件的urlManager组件中增进对userProfile操纵

[ 'POST login' => 'login','GET user-profile' => 'user-profile',]

我们用postman模仿哀求会见下 /v1/users/user-profile?token=apeuT9dAgH072qbfrtihfzL6qDe_l4qz_1479626145发明,抛出了一个非常

"findIdentityByAccessToken" is not implemented.

这是怎么回事呢?

我们找到 yiifiltersauthQueryParamAuth 的authenticate要领,发明这里挪用了 commonmodelsUser类的loginByAccessToken要领,有同窗迷惑了,commonmodelsUser类没实现loginByAccessToken要领为啥说findIdentityByAccessToken要领没实现?假如你还记得commonmodelsUser类实现了yiiwebuser类的接口的话,你应该会打开yiiwebUser类找谜底。没错,loginByAccessToken要领在yiiwebUser中实现了,该类中挪用了commonmodelsUser的findIdentityByAccessToken,可是我们看到,该要领中通过throw抛出了非常,也就是嗣魅这个要领要我们本技艺动实现!

这好办了,我们就来实现下commonmodelsUser类的findIdentityByAccessToken要领吧

return static::findOne(['api_token' => $token,'status' => self::STATUS_ACTIVE]);
// throw new NotSupportedException('"findIdentityByAccessToken" is not implemented.');
}

验证完token的有用性,下面就要开始实现首要的营业逻辑部门了。

$user->id,'username' => $user->username,'email' => $user->email,]; }

处事端返回的数据范例界说

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读