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

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

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

媒介

什么是restful气魄威风凛凛的api呢?我们之前有写过来先容其观念以及根基操纵。

既然写过了,那本日是要说点什么吗?

这篇文章首要针对现实场景中api的陈设来写。

我们本日就来大大的侃侃那些年api碰着的授权验证题目!独家干活,假如看完有所受益,记得不要健忘给我点赞哦。

营业说明

我们先来相识一下整个逻辑

  • 用户在客户端填写登录表单
  • 用户提交表单,客户端哀求登录接口login
  • 处事端校验用户的帐号暗码,并返回一个有用的token给客户端
  • 客户端拿到用户的token,将之存储在客户端好比cookie中
  • 客户端携带token会见必要校验的接口好比获取用户小我私人书息接口
  • 处事端校验token的有用性,校验通过,横竖返回客户端必要的信息,校验失败,必要用户从头登录

本文我们以用户登录,获取用户的小我私人书息为例举办具体的完备版声名。 以上,即是我们本篇文章要实现的重点。先别感动,也别求助,说明好了之后,细节部门我们再一步一个脚迹走下去。

筹备事变

  • 你应该有一个api应用,假如你还没有,请先移步这里→_→Restful api基本
  • 对付客户端,我们筹备回收postman举办模仿,假如你的google赏识器还没有安装postman,请先自行下载
  • 要测试的用户表必要有一个api_token的字段,没有的请先自行添加,并担保该字段足够长度
  • api应用开启了路由美化,并先设置post范例的login操纵和get范例的signup-test操纵
  • 封锁了user组件的session会话

关于上面筹备事变的第4点和第5点,我们贴一下代码利便领略

[ 'user' => [ 'identityClass' => 'commonmodelsUser','enableAutoLogin' => true,'enableSession' => false,],'urlManager' => [ 'enablePrettyUrl' => true,'showScriptName' => false,'enableStrictParsing' => true,'rules' => [ [ 'class' => 'yiirestUrlRule','controller' => ['v1/user'],'extraPatterns' => [ 'POST login' => 'login','GET signup-test' => 'signup-test',] ],] ],// ...... ],

signup-test操纵我们后头添加测试用户,为登录操纵提供便利。其他范例的操纵后头看必要再做添加。

认证类的选择

我们在apimodulesv1controllersUserController中设定的model类指向 commonmodelsUser类,为了声名重点这里我们就不光独拿出来重写了,看列位必要,有须要的话再单独copy一个User类到apimodels下。

校验用户权限我们以 yiifiltersauthQueryParamAuth 为例

public function behaviors()
{
return ArrayHelper::merge (parent::behaviors(),[
'authenticator' => [
'class' => QueryParamAuth::className()
]
] );
}

云云一来,那岂不是全部会见user的操纵都必要认证了?那不可,客户端第一个会见login操纵的时辰哪来的token,yiifiltersauthQueryParamAuth对外提供一个属性,用于过滤不必要验证的action。我们将UserController的behaviors要领稍作修改

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

这样login操纵就无需权限验证即可会见了。

添加测试用户

为了停止让客户端登录失败,我们先写一个简朴的要领,往user表内里插入两条数据,便于接下来的校验。

UserController增进signupTest操纵,留意此要领不属于讲授范畴之内,我们仅用于利便测试。

generateAuthKey(); $user->setPassword('123456'); $user->username = '111'; $user->email = '111@111.com'; $user->save(false);

return [
'code' => 0
];
}

如上,我们添加了一个username是111,暗码是123456的用户

登录操纵

假设用户在客户端输入用户名和暗码举办登录,处事端login操纵着实很简朴,大部门的营业逻辑处理赏罚都在apimodelsloginForm上,来先看看login的实现

use apimodelsLoginForm;

setAttributes(Yii::$app->request->post()); if ($user = $model->login()) { if ($user instanceof IdentityInterface) { return $user->api_token; } else { return $user->errors; } } else { return $model->errors; } }

登录乐成后这里给客户端返回了用户的token,再来看看登录的详细逻辑的实现

新建apimodelsLoginForm.PHP

use Yii;
use yiibaseModel;
use commonmodelsUser;

/**

  • Login form
    */
    class LoginForm extends Model
    {
    public $username;
    public $password;

private $_user;

const GET_API_TOKEN = 'generate_api_token';

public function init ()
{
parent::init();
$this->on(self::GET_API_TOKEN,[$this,'onGenerateApiToken']);
}

/**

  • @inheritdoc
  • 对客户端表单数据举办验证的rule
    */
    public function rules()
    {
    return [
    [['username','password'],'required'],['password','validatePassword'],];
    }

/**

  • 自界说的暗码认证要领
    */
    public function validatePassword($attribute,$params)
    {
    if (!$this->hasErrors()) {
    $this->_user = $this->getUser();
    if (!$this->_user || !$this->_user->validatePassword($this->password)) {
    $this->addError($attribute,'用户名或暗码错误.');
    }
    }
    }
    /**
  • @inheritdoc
    */
    public function attributeLabels()
    {
    return [
    'username' => '用户名','password' => '暗码',];
    }
    /**
  • Logs in a user using the provided username and password.
  • @return boolean whether the user is logged in successfully
    */
    public function login()
    {
    if ($this->validate()) {
    $this->trigger(self::GET_API_TOKEN);
    return $this->_user;
    } else {
    return null;
    }
    }

(编辑:湖南网)

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

热点阅读