zoukankan      html  css  js  c++  java
  • API开发之接口安全(四)----sign的唯一性

    r如何解决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 解刨也可以告一段落了 欢迎小伙伴们 补充

  • 相关阅读:
    [ 9.10 ]CF每日一题系列—— 186A模拟处理字符串
    python查看删除你微信的账号
    python进阶之路4.2---装饰器
    python进阶之路4.1---生成器与迭代器
    Python进阶之路---1.4python数据类型-数字
    Python进阶之路---1.3python环境搭建
    Python进阶之路---1.2python版本差异
    Python进阶之路---1.1python简介
    麦进斗Magento2 SEO默认设置的完整策划
    如何修改Magento主题中的toplinks
  • 原文地址:https://www.cnblogs.com/we-jack/p/11363124.html
Copyright © 2011-2022 走看看