在做一些api接口设计时候会遇到设置权限问题,比如我这个接口只有指定的用户才能访问。
很多时候api接口是属于无状态的,没办法获取session,就不能够用登录的机制去验证,那么
大概的思路是在请求包带上我们自己构造好的签名,这个签名必须满足下面几点:
a、唯一性,签名是唯一的,可验证目标用户
b、可变性,每次携带的签名必须是变化的
c、时效性,具有一定的时效,过期作废
d、完整性,能够对数据包进行验证,防止篡改
直接看下面代码
<?php
// 设置一个公钥(key)和私钥(secret),公钥用于区分用户,私钥加密数据,不能公开
$key ="c4ca4238a0b923820dcc509a6f75849b";$secret ="28c8edde3d61a0411511d3b1866f0636";
// 待发送的数据包
$data =array('username'=>'abc@qq.com','sex'=>'1','age'=>'16','addr'=>'guangzhou','key'=> $key,'timestamp'=> time(),);
// 获取sign
functiongetSign($secret, $data){
// 对数组的值按key排序
ksort($data);
// 生成url的形式
$params = http_build_query($data);
// 生成sign
$sign = md5($params . $secret);return$sign;}
// 发送的数据加上sign$data['sign'] = getSign($secret, $data);
/** * 后台验证sign是否合法 *@param[type] $secret [description] *@param[type] $data [description] *@return[type] [description] */
functionverifySign($secret, $data){
// 验证参数中是否有签名
if(!isset($data['sign']) || !$data['sign']) {
echo'发送的数据签名不存在';die();
}
if(!isset($data['timestamp']) || !$data['timestamp']) {
echo'发送的数据参数不合法';die();
}
// 验证请求, 10分钟失效
if(time() - $data['timestamp'] >600) {
echo'验证失效, 请重新发送请求';die();
}
$sign = $data['sign'];unset($data['sign']);
ksort($data);
$params = http_build_query($data);
// $secret是通过key在api的数据库中查询得到
$sign2 = md5($params . $secret);if($sign == $sign2) {
die('验证通过');
}else{
die('请求不合法');
}}?>