浅谈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类就可以啦 ,当然,还有一些细节需要我们处理
如需了解更多,可以查看下一篇文章,将讲解如何定义sign有效时间浅谈API开发安全之sign有效时间(三)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值