前面我们说了sign的生成,那么我们如何确定这个sign的准确性呢,接下来,我们说说校验sign的那些事
在拿到header里面的内容之后 我们首先需要对其内容的基本参数做一个校验,我们补充下Common类的代码
<?php
/**
* Created by PhpStorm.
* User: Administrator
* Date: 2019/8/15
* Time: 15:00
*/
namespace app\index\controller;
use app\common\lib\execption\ApiException;
use think\Controller;
class Common extends Controller
{
public function _initialize(){
$this->checkRequestAuth();
}
public function checkRequestAuth(){
$header = request()->header();
##判断header中基础参数
if(empty($header['sign'])){
throw new ApiException('sign不存在',400);
}
if(!in_array($header['app_type'],config("app.app_types"))){
throw new ApiException('app_type不合法',400);
}
}
}
判定基础参数之后,我们就要进入正题了,校验sign,那么在鉴权类 IAuth 里面新增 checkSignPass 方法,校验sign
/**
* 校验SIGN是否正常
* @param $data
*/
public static function checkSignPass($data){
##解密
$str = (new Aes())->decrypt($data['sign']);
if(empty($str)){
return false;
}
##转换为数组
parse_str($str,$arr);
##判定条件根据需求可增加
if(!is_array($arr) || empty($arr['did']) || $arr['did'] != $data['did']){
return false;
}
return true;
}
方法添加完成后 我们需要在Common里面进行校验
<?php
/**
* Created by PhpStorm.
* User: Administrator
* Date: 2019/8/15
* Time: 15:00
*/
namespace app\index\controller;
use app\common\lib\execption\ApiException;
use app\common\lib\IAuth;
use think\Controller;
class Common extends Controller
{
public $header = '';
public function _initialize(){
$this->checkRequestAuth();
}
public function checkRequestAuth(){
$header = request()->header();
##判断header中基础参数
if(empty($header['sign'])){
throw new ApiException('sign不存在',400);
}
if(!in_array($header['apptype'],config("app.app_types"))){
throw new ApiException('app_type不合法',400);
}
##调用鉴权类校验sign的准确性
if(!IAuth::checkSignPass($header)){
throw new ApiException('授权码sign失败',401);
}
##如果校验通过 将header值存起来 方便后面使用
$this->header = $header;
}
}
到这里sign基本就校验完毕,后面只需要业务逻辑类,继承Common类就可以啦 ,当然,还有一些细节需要我们处理
如需了解更多,可以查看下一篇文章,将讲解如何定义sign有效时间浅谈API开发安全之sign有效时间(三)