浅谈API开发安全之sign的唯一性(四)

如何解决sign的唯一性呢,在以往的经验中,我们都是通过标识来确定,如果有,那就用过如果没有那就是没用过,当然我们还需要将sign存储起来,这样我们才能更好的去判断他是否用过
存储的话,我们有几种方式 ,可以存在文件中,也可以存在数据库中,更甚至,我们可以存在redis中,这里我存在文件中,也就是 Cache 中

我们需要在校验通过的时候 将 sign 写入到Cache 中
那么修改 common 类 如下:

    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);
        }

//         $data = [
//             'did' => $header['did'],
//             'apptype' => $header['apptype'],
//             'time' => Time::get13TimeStamp(),
//         ];
//         halt(IAuth::setSign($data));


        if(!IAuth::checkSignPass($header)){
            throw new ApiException('授权码sign失败',401);
        }
      ##增加到缓存文件中  config在配置文件中写入
        Cache::set($header['sign'],1,config('app.app_sign_cache_time'));

        $this->header = $header;
    }

写入到Cache中之后,我们需要在下次校验的时候,获取到这个缓存判断他是否为1,那么我们需要修改下我们的 鉴权类

 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;
        }

        ##乘除1000增加唯一性
        if((time() - ceil($arr['time']/1000)) > config('app.app_sign_time')){
            return false;
        }
        ##判断是否有这个缓存 有就返回false 说明这个 sign已经用过
        if(Cache::get($data['sign'])){
            return false;
        }
        return true;
    }   

这样我们的sign就具有了唯一性 ,以上几篇文章中,代码的逻辑,还需要根据具体的场景进行修改,但是大致流程就是这样,至此我们的 sign 解刨也可以告一段落了

如需了解更多,可以查看第一篇文章,讲解sign的生成浅谈API开发安全之生成sign(一)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值