在这里插入图片描述
sign(客户端和服务端约定的加盟方式) 验签每次http请都放在header中
Header中放一些基础的参数 比如sign , version 版本号 , app_type 客户端类型 model:手机类型 小米 华为…
sign如何生成?
1:AES对称加密算法
2:sign算法生成
2:sign的唯一性
(1)写入静态文件中
(2)写入mysql中
(3)放入redis
//sign放入缓存
Cache::set($header['sign'],1,config('app.app_sign_cache_time'));
//校验sign唯一性判断
if(Cache::get($data['sign']))//存在说明该sign已经被请求了
{
return false;
}
以PHP服务端为例 (TP5)
写一个公共conmon控制器继承于次
/*
* 初始化方法
* */
protected function _initialize()
{
$this->checkRequestAuth(); //默认调用检查 方法 比如header里面的参数
}
/*
* 检查每一次APP请求的数据是否合法
* */
public function checkRequestAuth()
{
//首先获取header中的数据
$header = request()->header();
//进行校验
//todo
//sign 校验
if(empty($header['sign']))
{
throw new ApiException('签名不存在',400);
}
if(!in_array($header['modeltype'],config('app.apptypes'))){//判断APPtype是否在某一个数组里面
throw new ApiException('该手机不能使用服务!',400);
}
//sign校验
$check_res = IAuth::checkSignPass($header);
if(!$check_res)
{
throw new ApiException('sign授权失败',400);
}
//sign放入缓存
Cache::set($header['sign'],1,config('app.app_sign_cache_time'));
$this->headers = $header;
}
/**
检查SIGN是否正常
*/
public static function checkSignPass($data)
{
try {
$str = (new Aes())->decrypt($data['sign']);
}catch (\Exception $e)
{
throw new ApiException('sign不合法!',400);
}
if (empty($str)) {
return false;
}
//xxx=xx&&aaa=aa 将这种格式的字符串转为数组格式
parse_str($str,$arr);
if(!is_array($arr))// 可加入其他的判断
{
return false;
}
if((time() - ceil($arr['time']/ 1000)>config('app.app_sign_time'))) //判断时间是否过期 10妙
{
return false;
}
//sign唯一性判断
if(Cache::get($data['sign']))//存在说明该sign已经被请求了
{
return false;
}
return true;
}
有待提高 写作水平 !!! 加油