zoukankan      html  css  js  c++  java
  • PHP API 接口访问之签名验证

    设计思路:1、前后端商定统一的加密规则;2、后端配置文件保存固定的验证字符串;3、对前端传的加密sign进行合法性验证、时效验证、唯一性验证;

    代码如下:

            1、验证前端传过来的sign(抛出异常的接口是我自己框架封装的接口,没封装可以改成Exception)

      

    <?php
    /**
     * Created by PhpStorm.
     * User: hjx(2896751917@qq.com)
     * Date: 2019/2/21
     */
    
    namespace appapicontroller;
    
    
    use appcommonlibexceptionApiException;
    use appcommonlibextendAes;
    use thinkCache;
    use thinkController;
    use thinkRequest;
    
    class Common extends Controller
    {
        protected $apiToken = null;
    
        public function __construct(Request $request = null)
        {
            parent::__construct($request);
            $this->verifyToken();
        }
    
        /**
         * 访问API时进行sign验证
         * @return bool
         * @throws ApiException
         */
        public function verifyToken() {
            $data = input('param.');
    
            $validate = validate('Common');
            if(!$validate->check($data)) {
                throw new ApiException($validate->getError(), 400);
            }
    
            $str = (new Aes())->decrypt($data['sign']);
            if(!$str) {
                throw new ApiException('sign不合法', 401);
            }
    
            list($t1,$t2) = explode('&',$str);
            //sign失效时间
            if(time() - $t1 > 600) {
                throw new ApiException('sign已过期', 401);
            }
            //验证规则
            if($t2 != config('api.CorpId')) {
                throw new ApiException('sign不合法', 401);
            }
            //验证sign唯一性
            if(Cache::get($data['sign'])) {
                throw new ApiException('sign已使用过', 401);
            }
    
            Cache::set($data['sign'],1,3600);
    
            return true;
        }
    
    }
    

      

      

      2、各个控制器都继承上面的Common控制器即可


     3、后台加密规则
    <?php
    /**
     * Created by PhpStorm.
     * User: hjx
     * Date: 2019/3/12
     * Time: 10:41
     */
    
    namespace appapicontroller;
    
    use appcommonlibextendAes;
    
    class Test
    {
        /**
         * token创建规则,以后前端得按照这个规则进行
         * @return appcommonlibextendHexString
         */
        public function createToken() {
            $str = time().'&'.config('api.CorpId');
            return (new Aes())->encrypt($str);
        }
    }
    

      后台加密只是示例的加密规则,可以给前端按照这种加密方式进行加密得到sign

  • 相关阅读:
    转:SVN Eclipse插件Subclipse安装和配置
    Apache、php、mysql单独安装配置
    HDU 1150:Machine Schedule(二分匹配,匈牙利算法)
    Oracle 数据的导入和导出(SID service.msc)
    swift-数组array
    wxWidgets刚開始学习的人导引(4)——wxWidgets学习资料及利用方法指导
    用php 把数组中偶数,选择出来
    java 异常 之 实战篇(trows 和 try catch Dead Code)
    语言处理程序
    使用Maven构建和部署J2EE应用程序的EAR文件
  • 原文地址:https://www.cnblogs.com/hjxcode/p/10515531.html
Copyright © 2011-2022 走看看