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

  • 相关阅读:
    理解Express express.static 和 __direname 及 __firename的含义
    HTTP请求中 request payload 和 formData 区别?
    POST提交数据之---Content-Type的理解;
    前端域名访问页面中的一些配置项
    使用Nginx来解决跨域的问题
    vue-resource get/post请求如何携带cookie的问题
    socket实现聊天功能(二)
    go语言之进阶篇通过结构体生成json
    go语言之进阶篇JSON处理
    go语言之进阶篇正则表达式
  • 原文地址:https://www.cnblogs.com/hjxcode/p/10515531.html
Copyright © 2011-2022 走看看