php的api接口
<p id="php的api接口">在实际工作中,使用PHP写api接口是经常做的,PHP写好接口后,前台就可以通过链接获取接口提供的数据,而返回的数据一般分为两种情况,xml和json,在这个过程中,服务器并不知道,请求的来源是什么,有可能是别人非法调用我们的接口,获取数据,因此就要使用安全验证。</p><h3 id="验证原理">一、验证原理</h3>
<h4 id="示意图">1、示意图</h4>
<p><img class="has lazyload" alt="这里写图片描述" data-src="https://img-blog.csdn.net/20170317142531762?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGk3NDEzNTAxNDk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast"></p>
<h4 id="原理">2、原理</h4>
<p>从图中可以看得很清楚,前台想要调用接口,需要使用几个参数生成签名。</p>
<ul>
<li>时间戳:当前时间</li>
<li>随机数:随机生成的随机数</li>
<li>口令:前后台开发时,一个双方都知道的标识,相当于暗号</li>
<li>算法规则:商定好的运算规则,上面三个参数可以利用算法规则生成一个签名。</li>
</ul>
<p>前台生成一个签名,当需要访问接口的时候,把时间戳,随机数,签名通过URL传递到后台。后台拿到时间戳,随机数后,通过一样的算法规则计算出签名,然后和传递过来的签名进行对比,一样的话,返回数据。</p>
<h4 id="算法规则">3、算法规则</h4>
<p>在前后台交互中,算法规则是非常重要的,前后台都要通过算法规则计算出签名,至于规则怎么制定,看你怎么高兴怎么来。</p>
<p>我这个算法规则是</p>
<ol>
<li>时间戳,随机数,口令按照首字母大小写顺序排序</li>
<li>然后拼接成字符串</li>
<li>进行sha1加密</li>
<li>再进行MD5加密</li>
<li>转换成大写。</li>
</ol>
<h3 id="前台">二、功能实现</h3>
<h4>1、前台</h4>
<p>这里我并没有实际的前台,直接使用一个PHP文件代替前台,然后通过CURL模拟GET请求。我使用的是TP框架,URL格式是pathinfo格式。</p>
<div class="cnblogs_code"><img id="code_img_closed_99a61228-49cd-4f4a-ab1a-7125be47867d" class="code_img_closed lazyload" alt="" data-src="http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif"><img id="code_img_opened_99a61228-49cd-4f4a-ab1a-7125be47867d" class="code_img_opened lazyload" style="display: none" alt="" data-src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif">
<div id="cnblogs_code_open_99a61228-49cd-4f4a-ab1a-7125be47867d" class="cnblogs_code_hide">
<pre><?<span style="color: rgba(0, 0, 0, 1)">php
</span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
* Created by PhpStorm.
* User: Administrator
* Date: 2017/3/16 0016
* Time: 15:56
</span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
namespace Client\Controller;
</span><span style="color: rgba(0, 0, 255, 1)">use</span><span style="color: rgba(0, 0, 0, 1)"> Think\Controller;
</span><span style="color: rgba(0, 0, 255, 1)">class</span> ClientController <span style="color: rgba(0, 0, 255, 1)">extends</span><span style="color: rgba(0, 0, 0, 1)"> Controller{
</span><span style="color: rgba(0, 0, 255, 1)">const</span> TOKEN = 'API'<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">模拟前台请求服务器api接口</span>
<span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> getDataFromServer(){
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">时间戳</span>
<span style="color: rgba(128, 0, 128, 1)">$timeStamp</span> = <span style="color: rgba(0, 128, 128, 1)">time</span><span style="color: rgba(0, 0, 0, 1)">();
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">随机数</span>
<span style="color: rgba(128, 0, 128, 1)">$randomStr</span> = <span style="color: rgba(128, 0, 128, 1)">$this</span> -><span style="color: rgba(0, 0, 0, 1)"> createNonceStr();
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">生成签名</span>
<span style="color: rgba(128, 0, 128, 1)">$signature</span> = <span style="color: rgba(128, 0, 128, 1)">$this</span> -> arithmetic(<span style="color: rgba(128, 0, 128, 1)">$timeStamp</span>,<span style="color: rgba(128, 0, 128, 1)">$randomStr</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">url地址</span>
<span style="color: rgba(128, 0, 128, 1)">$url</span> = "http://www.apitest.com/Server/Server/respond/t/{<span style="color: rgba(128, 0, 128, 1)">$timeStamp</span>}/r/{<span style="color: rgba(128, 0, 128, 1)">$randomStr</span>}/s/{<span style="color: rgba(128, 0, 128, 1)">$signature</span>}"<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(128, 0, 128, 1)">$result</span> = <span style="color: rgba(128, 0, 128, 1)">$this</span> -> httpGet(<span style="color: rgba(128, 0, 128, 1)">$url</span><span style="color: rgba(0, 0, 0, 1)">);
dump(</span><span style="color: rgba(128, 0, 128, 1)">$result</span><span style="color: rgba(0, 0, 0, 1)">);
}
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">curl模拟get请求。</span>
<span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">function</span> httpGet(<span style="color: rgba(128, 0, 128, 1)">$url</span><span style="color: rgba(0, 0, 0, 1)">){
</span><span style="color: rgba(128, 0, 128, 1)">$curl</span> =<span style="color: rgba(0, 0, 0, 1)"> curl_init();
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">需要请求的是哪个地址</span>
curl_setopt(<span style="color: rgba(128, 0, 128, 1)">$curl</span>,CURLOPT_URL,<span style="color: rgba(128, 0, 128, 1)">$url</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">表示把请求的数据已文件流的方式输出到变量中</span>
curl_setopt(<span style="color: rgba(128, 0, 128, 1)">$curl</span>,CURLOPT_RETURNTRANSFER,1<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(128, 0, 128, 1)">$result</span> = curl_exec(<span style="color: rgba(128, 0, 128, 1)">$curl</span><span style="color: rgba(0, 0, 0, 1)">);
curl_close(</span><span style="color: rgba(128, 0, 128, 1)">$curl</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 128, 1)">$result</span><span style="color: rgba(0, 0, 0, 1)">;
}
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">随机生成字符串</span>
<span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">function</span> createNonceStr(<span style="color: rgba(128, 0, 128, 1)">$length</span> = 8<span style="color: rgba(0, 0, 0, 1)">) {
</span><span style="color: rgba(128, 0, 128, 1)">$chars</span> = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(128, 0, 128, 1)">$str</span> = ""<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">for</span> (<span style="color: rgba(128, 0, 128, 1)">$i</span> = 0; <span style="color: rgba(128, 0, 128, 1)">$i</span> < <span style="color: rgba(128, 0, 128, 1)">$length</span>; <span style="color: rgba(128, 0, 128, 1)">$i</span>++<span style="color: rgba(0, 0, 0, 1)">) {
</span><span style="color: rgba(128, 0, 128, 1)">$str</span> .= <span style="color: rgba(0, 128, 128, 1)">substr</span>(<span style="color: rgba(128, 0, 128, 1)">$chars</span>, <span style="color: rgba(0, 128, 128, 1)">mt_rand</span>(0, <span style="color: rgba(0, 128, 128, 1)">strlen</span>(<span style="color: rgba(128, 0, 128, 1)">$chars</span>) - 1), 1<span style="color: rgba(0, 0, 0, 1)">);
}
</span><span style="color: rgba(0, 0, 255, 1)">return</span> "z".<span style="color: rgba(128, 0, 128, 1)">$str</span><span style="color: rgba(0, 0, 0, 1)">;
}
</span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
* @param $timeStamp 时间戳
* @param $randomStr 随机字符串
* @return string 返回签名
</span><span style="color: rgba(0, 128, 0, 1)">*/</span>
<span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">function</span> arithmetic(<span style="color: rgba(128, 0, 128, 1)">$timeStamp</span>,<span style="color: rgba(128, 0, 128, 1)">$randomStr</span><span style="color: rgba(0, 0, 0, 1)">){
</span><span style="color: rgba(128, 0, 128, 1)">$arr</span>['timeStamp'] = <span style="color: rgba(128, 0, 128, 1)">$timeStamp</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(128, 0, 128, 1)">$arr</span>['randomStr'] = <span style="color: rgba(128, 0, 128, 1)">$randomStr</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(128, 0, 128, 1)">$arr</span>['token'] = self::<span style="color: rgba(0, 0, 0, 1)">TOKEN;
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">按照首字母大小写顺序排序</span>
<span style="color: rgba(0, 128, 128, 1)">sort</span>(<span style="color: rgba(128, 0, 128, 1)">$arr</span>,<span style="color: rgba(0, 0, 0, 1)">SORT_STRING);
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">拼接成字符串</span>
<span style="color: rgba(128, 0, 128, 1)">$str</span> = <span style="color: rgba(0, 128, 128, 1)">implode</span>(<span style="color: rgba(128, 0, 128, 1)">$arr</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">进行加密</span>
<span style="color: rgba(128, 0, 128, 1)">$signature</span> = <span style="color: rgba(0, 128, 128, 1)">sha1</span>(<span style="color: rgba(128, 0, 128, 1)">$str</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(128, 0, 128, 1)">$signature</span> = <span style="color: rgba(0, 128, 128, 1)">md5</span>(<span style="color: rgba(128, 0, 128, 1)">$signature</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">转换成大写</span>
<span style="color: rgba(128, 0, 128, 1)">$signature</span> = <span style="color: rgba(0, 128, 128, 1)">strtoupper</span>(<span style="color: rgba(128, 0, 128, 1)">$signature</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 128, 1)">$signature</span><span style="color: rgba(0, 0, 0, 1)">;
}
}</span></pre>
</div>
<span class="cnblogs_code_collapse">View Code</span></div>
<p><strong>2、服务器端:接受前台数据进行验证</strong></p>
<div class="cnblogs_code"><img id="code_img_closed_d19883dc-7299-47b9-9ae4-e9c0bd27945a" class="code_img_closed lazyload" alt="" data-src="http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif"><img id="code_img_opened_d19883dc-7299-47b9-9ae4-e9c0bd27945a" class="code_img_opened lazyload" style="display: none" alt="" data-src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif">
<div id="cnblogs_code_open_d19883dc-7299-47b9-9ae4-e9c0bd27945a" class="cnblogs_code_hide">
<pre><?<span style="color: rgba(0, 0, 0, 1)">php
</span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
* Created by PhpStorm.
* User: Administrator
* Date: 2017/3/16 0016
* Time: 16:01
</span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
namespace Server\Controller;
</span><span style="color: rgba(0, 0, 255, 1)">use</span><span style="color: rgba(0, 0, 0, 1)"> Think\Controller;
</span><span style="color: rgba(0, 0, 255, 1)">class</span> ServerController <span style="color: rgba(0, 0, 255, 1)">extends</span><span style="color: rgba(0, 0, 0, 1)"> Controller{
</span><span style="color: rgba(0, 0, 255, 1)">const</span> TOKEN = 'API'<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">响应前台的请求</span>
<span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> respond(){
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">验证身份</span>
<span style="color: rgba(128, 0, 128, 1)">$timeStamp</span> = <span style="color: rgba(128, 0, 128, 1)">$_GET</span>['t'<span style="color: rgba(0, 0, 0, 1)">];
</span><span style="color: rgba(128, 0, 128, 1)">$randomStr</span> = <span style="color: rgba(128, 0, 128, 1)">$_GET</span>['r'<span style="color: rgba(0, 0, 0, 1)">];
</span><span style="color: rgba(128, 0, 128, 1)">$signature</span> = <span style="color: rgba(128, 0, 128, 1)">$_GET</span>['s'<span style="color: rgba(0, 0, 0, 1)">];
</span><span style="color: rgba(128, 0, 128, 1)">$str</span> = <span style="color: rgba(128, 0, 128, 1)">$this</span> -> arithmetic(<span style="color: rgba(128, 0, 128, 1)">$timeStamp</span>,<span style="color: rgba(128, 0, 128, 1)">$randomStr</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 0, 255, 1)">if</span>(<span style="color: rgba(128, 0, 128, 1)">$str</span> != <span style="color: rgba(128, 0, 128, 1)">$signature</span><span style="color: rgba(0, 0, 0, 1)">){
</span><span style="color: rgba(0, 0, 255, 1)">echo</span> "-1"<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">exit</span><span style="color: rgba(0, 0, 0, 1)">;
}
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">模拟数据</span>
<span style="color: rgba(128, 0, 128, 1)">$arr</span>['name'] = 'api'<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(128, 0, 128, 1)">$arr</span>['age'] = 15<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(128, 0, 128, 1)">$arr</span>['address'] = 'zz'<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(128, 0, 128, 1)">$arr</span>['ip'] = "192.168.0.1"<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">echo</span> json_encode(<span style="color: rgba(128, 0, 128, 1)">$arr</span><span style="color: rgba(0, 0, 0, 1)">);
}
</span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
* @param $timeStamp 时间戳
* @param $randomStr 随机字符串
* @return string 返回签名
</span><span style="color: rgba(0, 128, 0, 1)">*/</span>
<span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">function</span> arithmetic(<span style="color: rgba(128, 0, 128, 1)">$timeStamp</span>,<span style="color: rgba(128, 0, 128, 1)">$randomStr</span><span style="color: rgba(0, 0, 0, 1)">){
</span><span style="color: rgba(128, 0, 128, 1)">$arr</span>['timeStamp'] = <span style="color: rgba(128, 0, 128, 1)">$timeStamp</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(128, 0, 128, 1)">$arr</span>['randomStr'] = <span style="color: rgba(128, 0, 128, 1)">$randomStr</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(128, 0, 128, 1)">$arr</span>['token'] = self::<span style="color: rgba(0, 0, 0, 1)">TOKEN;
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">按照首字母大小写顺序排序</span>
<span style="color: rgba(0, 128, 128, 1)">sort</span>(<span style="color: rgba(128, 0, 128, 1)">$arr</span>,<span style="color: rgba(0, 0, 0, 1)">SORT_STRING);
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">拼接成字符串</span>
<span style="color: rgba(128, 0, 128, 1)">$str</span> = <span style="color: rgba(0, 128, 128, 1)">implode</span>(<span style="color: rgba(128, 0, 128, 1)">$arr</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">进行加密</span>
<span style="color: rgba(128, 0, 128, 1)">$signature</span> = <span style="color: rgba(0, 128, 128, 1)">sha1</span>(<span style="color: rgba(128, 0, 128, 1)">$str</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(128, 0, 128, 1)">$signature</span> = <span style="color: rgba(0, 128, 128, 1)">md5</span>(<span style="color: rgba(128, 0, 128, 1)">$signature</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">转换成大写</span>
<span style="color: rgba(128, 0, 128, 1)">$signature</span> = <span style="color: rgba(0, 128, 128, 1)">strtoupper</span>(<span style="color: rgba(128, 0, 128, 1)">$signature</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 128, 1)">$signature</span><span style="color: rgba(0, 0, 0, 1)">;
}
}</span></pre>
</div>
<span class="cnblogs_code_collapse">View Code</span></div>
<p><strong>3、结果</strong></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">string</span>(57) "{"name":"api","age":15,"address":"zz","ip":"192.168.0.1"}"</pre>
</div>
<h2 id="总结">总结</h2>
<p>这种方法只是其中的一种方法,其实还有很多方法都是可以进行安全验证的。</p>
<p> </p>
<p id="源代码"><em>参考:https://blog.csdn.net/fmyzc/article/details/78798684</em></p><br><br>
来源:https://www.cnblogs.com/ivy-zheng/p/11064958.html
頁:
[1]