page contents

php面试问题:API接口如何开发的?

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

attachments-2021-07-4dOrr6Jd60ff6940973e6.jpg

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

验证原理
示意图

attachments-2021-07-UpXjXipU60ff688572639.jpg

原理

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

  • 时间戳:当前时间
  • 随机数:随机生成的随机数
  • 口令:前后台开发时,一个双方都知道的标识,相当于暗号
  • 算法规则:商定好的运算规则,上面三个参数可以利用算法规则生成一个签名。

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

算法规则

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

我这个算法规则是

  1. 时间戳,随机数,口令按照首字母大小写顺序排序
  2. 然后拼接成字符串
  3. 进行sha1加密
  4. 再进行MD5加密
  5. 转换成大写。

前台

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

源代码

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

服务器端

接受前台数据进行验证

源代码

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

结果

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

总结

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

更多相关技术内容咨询欢迎前往并持续关注六星社区了解详情。

程序员编程交流QQ群:805358732

如果你想用Python开辟副业赚钱,但不熟悉爬虫与反爬虫技术,没有接单途径,也缺乏兼职经验
关注下方微信公众号:Python编程学习圈,获取价值999元全套Python入门到进阶的学习资料以及教程,还有Python技术交流群一起交流学习哦。

attachments-2022-06-8sJ0GPlz62ad4d005c4ab.jpeg

  • 发表于 2021-07-27 10:03
  • 阅读 ( 404 )
  • 分类:PHP开发

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
轩辕小不懂
轩辕小不懂

2403 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 1478 文章
  3. Pack 1135 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章