php接口签名验证

在做一些api接口设计时候会遇到设置权限问题,比如我这个接口只有指定的用户才能访问。

很多时候api接口是属于无状态的,没办法获取session,就不能够用登录的机制去验证,那么

大概的思路是在请求包带上我们自己构造好的签名,这个签名必须满足下面几点:

a、唯一性,签名是唯一的,可验证目标用户

b、可变性,每次携带的签名必须是变化的

c、时效性,具有一定的时效,过期作废

d、完整性,能够对数据包进行验证,防止篡改

直接看下面代码

// 设置一个公钥(key)和私钥(secret),公钥用于区分用户,私钥加密数据,不能公开

$key ="c4ca4238a0b923820dcc509a6f75849b";$secret ="28c8edde3d61a0411511d3b1866f0636";

// 待发送的数据包

$data =array('username'=>'[email protected]','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('请求不合法');    

}}?>

你可能感兴趣的:(php接口签名验证)