php接口签名验证

在做一些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('请求不合法');    

}}?>

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容