PHP开发api接口验证实例

 3981

在实际工作中,使用PHP写api接口是经常做的,PHP写好接口后,前台就可以通过链接获取接口提供的数据,而返回的数据一般分为两种情况,xml和json,在这个过程中,服务器并不知道,请求的来源是什么,有可能是别人非法调用我们的接口,获取数据,因此就要使用安全验证

验证原理 - 示意图


6017bbca4df48.png


原理

从图中可以看得很清楚,前台想要调用接口,需要使用几个参数生成签名。

时间戳:当前时间

随机数:随机生成的随机数

口令:前后台开发时,一个双方都知道的标识,相当于暗号

算法规则:商定好的运算规则,上面三个参数可以利用算法规则生成一个签名。

前台生成一个签名,当需要访问接口的时候,把时间戳,随机数,签名通过URL传递到后台。后台拿到时间戳,随机数后,通过一样的算法规则计算出签名,然后和传递过来的签名进行对比,一样的话,返回数据。

算法规则

在前后台交互中,算法规则是非常重要的,前后台都要通过算法规则计算出签名,至于规则怎么制定,看你怎么高兴怎么来。

我这个算法规则是

1、时间戳,随机数,口令按照首字母大小写顺序排序

2、然后拼接成字符串

3、进行sha1加密

4、再进行MD5加密

5、转换成大写。

前台

这里我并没有实际的前台,直接使用一个PHP文件代替前台,然后通过CURL模拟GET请求。我使用的是TP框架,URL格式是pathinfo格式。

源代码

  1. <?php
  2. /**
  3.  * Created by PhpStorm.
  4.  * User: Administrator
  5.  * Date: 2020/3/16 0016
  6.  * Time: 15:56
  7.  */
  8. namespace Client\Controller;
  9. use Think\Controller;
  10.  
  11. class ClientController extends Controller
  12. {
  13.     const TOKEN = 'API';
  14.     
  15.     //模拟前台请求服务器api接口
  16.     public function getDataFromServer(){
  17.         //时间戳
  18.         $timeStamp = time();
  19.         //随机数
  20.         $randomStr = $this -> createNonceStr();
  21.         //生成签名
  22.         $signature = $this -> arithmetic($timeStamp,$randomStr);
  23.         //url地址
  24.         $url = "http://www.apitest.com/Server/Server/respond/t/{$timeStamp}/r/{$randomStr}/s/{$signature}";
  25.         $result = $this -> httpGet($url);
  26.         dump($result);
  27.     }
  28.     
  29.     //curl模拟get请求。
  30.     private function httpGet($url){
  31.         $curl = curl_init();
  32.         //需要请求的是哪个地址
  33.         curl_setopt($curl,CURLOPT_URL,$url);
  34.         //表示把请求的数据已文件流的方式输出到变量中
  35.         curl_setopt($curl,CURLOPT_RETURNTRANSFER,1);
  36.         $result = curl_exec($curl);
  37.         curl_close($curl);
  38.         return $result;
  39.     }
  40.     
  41.     //随机生成字符串
  42.     private function createNonceStr($length = 8) {
  43.         $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
  44.         $str = "";
  45.         for ($i = 0; $i < $length; $i++) {
  46.             $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
  47.         }
  48.         return "z".$str;
  49.     }
  50.     
  51.     /**
  52.      * @param $timeStamp 时间戳
  53.      * @param $randomStr 随机字符串
  54.      * @return string 返回签名
  55.      */
  56.     private function arithmetic($timeStamp,$randomStr){
  57.         $arr['timeStamp'] = $timeStamp;
  58.         $arr['randomStr'] = $randomStr;
  59.         $arr['token'] = self::TOKEN;
  60.         //按照首字母大小写顺序排序
  61.         sort($arr,SORT_STRING);
  62.         //拼接成字符串
  63.         $str = implode($arr);
  64.         //进行加密
  65.         $signature = sha1($str);
  66.         $signature = md5($signature);
  67.         //转换成大写
  68.         $signature = strtoupper($signature);
  69.         return $signature;
  70.     }
  71. }

服务器端

接受前台数据进行验证

源代码

  1. <?php
  2. /**
  3.  * Created by PhpStorm.
  4.  * User: Administrator
  5.  * Date: 2020/3/16 0016
  6.  * Time: 16:01
  7.  */
  8. namespace Server\Controller;
  9. use Think\Controller;
  10.  
  11. class ServerController extends Controller
  12. {
  13.     const TOKEN = 'API';
  14.     
  15.     //响应前台的请求
  16.     public function respond(){
  17.         //验证身份
  18.         $timeStamp = $_GET['t'];
  19.         $randomStr = $_GET['r'];
  20.         $signature = $_GET['s'];
  21.         $str = $this -> arithmetic($timeStamp,$randomStr);
  22.         if($str != $signature){
  23.             echo "-1";
  24.             exit;
  25.         }
  26.         //模拟数据
  27.         $arr['name'] = 'api';
  28.         $arr['age'] = 15;
  29.         $arr['address'] = 'zz';
  30.         $arr['ip'] = "192.168.0.1";
  31.         echo json_encode($arr);
  32.     }
  33.     
  34.     /**
  35.      * @param $timeStamp 时间戳
  36.      * @param $randomStr 随机字符串
  37.      * @return string 返回签名
  38.      */
  39.     public function arithmetic($timeStamp,$randomStr){
  40.         $arr['timeStamp'] = $timeStamp;
  41.         $arr['randomStr'] = $randomStr;
  42.         $arr['token'] = self::TOKEN;
  43.         //按照首字母大小写顺序排序
  44.         sort($arr,SORT_STRING);
  45.         //拼接成字符串
  46.         $str = implode($arr);
  47.         //进行加密
  48.         $signature = sha1($str);
  49.         $signature = md5($signature);
  50.         //转换成大写
  51.         $signature = strtoupper($signature);
  52.         return $signature;
  53.     }
  54. }

结果

  1. string(57) "{"name":"api","age":15,"address":"zz","ip":"192.168.0.1"}"

总结

这种方法只是其中的一种方法,其实还有很多方法都是可以进行安全验证的。


本文网址:https://www.zztuku.com/index.php/detail-8633.html
站长图库 - PHP开发api接口验证实例
申明:如有侵犯,请 联系我们 删除。

评论(0)条

您还没有登录,请 登录 后发表评论!

提示:请勿发布广告垃圾评论,否则封号处理!!

    编辑推荐

    在线客服插画矢量素材