加入收藏 | 设为首页 | 会员中心 | 我要投稿 衡阳站长网 (https://www.0734zz.cn/)- 数据集成、设备管理、备份、数据加密、智能搜索!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

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

发布时间:2021-01-17 22:42:53 所属栏目:PHP教程 来源:网络整理
导读:前言 什么是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;
    }
    }

(编辑:衡阳站长网)

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

热点阅读