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

夙愿已清 提交于 2019-11-27 12:03:35

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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!