API开发之接口安全(二)-----sign校验

上一章 我们说了 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类就可以啦  当然 还有一些细节需要我们处理  下一章 我们再来进行

posted @ 2019-08-16 09:09  Solo李  阅读(1430)  评论(3编辑  收藏  举报