正在实际工作中,应用PHP写api接口是常常做的,PHP写好接口后,前台就能够经过链接猎取接口提供的数据,而前往的数据普通分为两种状况,xml以及json,正在这个进程中,效劳器其实不晓得,申请的起源是甚么,有多是他人合法挪用咱们的接口,猎取数据,因而就要应用平安验证。
验证原理
表示图
原理
从图中能够看患上很分明,前台想要挪用接口,需求应用几个参数天生署名。
● 工夫戳:以后工夫
● 随机数:随机天生的随机数
● 口令:先后台开发时,一个单方都晓得的标识,相称于灯号
● 算法例则:约定好的运算规定,下面三个参数能够行使算法例则天生一个署名。
前台天生一个署名,当需求拜访接口的时分,把工夫戳,随机数,署名经过URL通报到后盾。后盾拿到工夫戳,随机数后,经过同样的算法例则较量争论出署名,而后以及通报过去的署名进行比照,同样的话,前往数据。
算法例则
正在先后台交互中,算法例则长短常首要的,先后台都要经过算法例则较量争论出署名,至于规定怎样制订,看你怎样快乐怎样来。
我这个算法例则是
● 工夫戳,随机数,口令依照首字母巨细写程序排序
● 而后拼接成字符串
● 进行sha1加密
● 再进行MD5加密
● 转换成年夜写。
前台
这里我并无实际的前台,间接应用一个PHP文件替代前台,而后经过CURL模仿GET申请。我应用的是TP框架,URL格局是pathinfo格局。
源代码
<?php /** * Created by PhpStorm. * User: Administrator * Date: 2017/3/16 0016 * Time: 15:56 */ namespace Client\Controller; use Think\Controller; class ClientController extends Controller{ const TOKEN = 'API'; //模仿前台申请效劳器api接口 public function getDataFromServer(){ //工夫戳 $timeStamp = time(); //随机数 $randomStr = $this -> createNonceStr(); //天生署名 $signature = $this -> arithmetic($timeStamp,$randomStr); //url地点 $url = "http://www.apitest.com/Server/Server/respond/t/{$timeStamp}/r/{$randomStr}/s/{$signature}"; $result = $this -> httpGet($url); dump($result); } //curl模仿get申请。 private function httpGet($url){ $curl = curl_init(); //需求申请的是哪一个地点 curl_setopt($curl,CURLOPT_URL,$url); //示意把申请的数据已文件流的形式输入到变量中 curl_setopt($curl,CURLOPT_RETURNTRANSFER,1); $result = curl_exec($curl); curl_close($curl); return $result; } //随机天生字符串 private function createNonceStr($length = 8) { $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; $str = ""; for ($i = 0; $i < $length; $i++) { $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1); } return "z".$str; } /** * @param $timeStamp 工夫戳 * @param $randomStr 随机字符串 * @return string 前往署名 */ private function arithmetic($timeStamp,$randomStr){ $arr['timeStamp'] = $timeStamp; $arr['randomStr'] = $randomStr; $arr['token'] = self::TOKEN; //依照首字母巨细写程序排序 sort($arr,SORT_STRING); //拼接成字符串 $str = implode($arr); //进行加密 $signature = sha1($str); $signature = md5($signature); //转换成年夜写 $signature = strtoupper($signature); return $signature; } }
效劳器端
承受前台数据进行验证
源代码
<?php /** * Created by PhpStorm. * User: Administrator * Date: 2017/3/16 0016 * Time: 16:01 */ namespace Server\Controller; use Think\Controller; class ServerController extends Controller{ const TOKEN = 'API'; //呼应前台的申请 public function respond(){ //验证身份 $timeStamp = $_GET['t']; $randomStr = $_GET['r']; $signature = $_GET['s']; $str = $this -> arithmetic($timeStamp,$randomStr); if($str != $signature){ echo "-1"; exit; } //模仿数据 $arr['name'] = 'api'; $arr['age'] = 15; $arr['address'] = 'zz'; $arr['ip'] = "192.168.0.1"; echo json_encode($arr); } /** * @param $timeStamp 工夫戳 * @param $randomStr 随机字符串 * @return string 前往署名 */ public function arithmetic($timeStamp,$randomStr){ $arr['timeStamp'] = $timeStamp; $arr['randomStr'] = $randomStr; $arr['token'] = self::TOKEN; //依照首字母巨细写程序排序 sort($arr,SORT_STRING); //拼接成字符串 $str = implode($arr); //进行加密 $signature = sha1($str); $signature = md5($signature); //转换成年夜写 $signature = strtoupper($signature); return $signature; } }
后果
string(57) "{"name":"api","age":15,"address":"zz","ip":"192.168.0.1"}"
总结
这类办法只是此中的一种办法,其实另有不少办法都是能够进行平安验证的。
更多PHP相干常识,请拜访PHP教程!
以上就是PHP开发api接口平安验证的具体内容,更多请存眷资源魔其它相干文章!
标签: php php开发教程 php开发资料 php开发自学
抱歉,评论功能暂时关闭!