后端代码
以下代码放在接口公共文件中
$apiAuth = new ApiAuth();
$signResult = $apiAuth->verifySign();
if (!$signResult['code']) {
$this->error($signResult['msg']);
}
ApiAuth类文件
<?php
class ApiAuth
{
public function __construct(){
$this->params = input();// 获取请求参数
$this->header = $this->app->request->header();// 获取头部请求信息
$this->appid = 'sdasdsfafjidfjfjbdfbxbfuixbfiudsbf';// 验签应用id(自定义随机字符串)
$this->appsecret = 'ibnuigyugyuvdaskbhjbhbdhasdjhs';// 验签密钥(自定义随机字符串)
//return $this;
}
/**
* 验证签名
* @return array
*/
public function verifySign()
{
$params = $this->params;
$header = $this->header;
// 验证请求头部参数中是否有签名字符串
if(!isset($header['api-sign']) && !$header['api-sign']){
return ['code' => 0, 'msg' => '签名不存在'];
}
// 验证请求是否超时
if(!isset($params['timestamp']) || empty($params['timestamp'])){
return ['code' => 0, 'msg' => '缺少必填参数'];
}
$expiration = 600;// 10分钟过期
if(time() - $params['timestamp'] > $expiration){
return ['code' => 0, 'msg' => '验证超时,请重新发送请求'];
}
$oldSign = $header['api-sign'];// 请求带过来的签名
$newSign = $this->makesign();// 现在生成签名
// 验证签名
if($newSign == $oldSign){
return ['code' => 1, 'msg' => ''];
}else{
return ['code' => 0, 'msg' => '请求不合法'];
}
}
/**
* 生成验签
* @return string
*/
protected function makesign()
{
$params = $this->params;
$sign = MD5(sha1($this->appid . $this->appsecret) . MD5($params['timestamp']) . sha1($this->appsecret . $this->appid));// 加密规则可按个人自定义,请求接口方也是按这种加密规则加密传递api-sign参数给接口
return $sign;
}
}
请求接口方(前端/小程序/第三方)
请求头部header必须带参数
header:{
'api-sign' => $this->sign,
}
$this->sign
计算方式按生成验签的规则一样,由接口方提供
$this->sign = MD5(sha1($this->appid . $this->appsecret) . MD5($params['timestamp']) . sha1($this->appsecret . $this->appid));
appid和appsecret也是由接口方提供
每个接口请求都必须带上timestamp
时间戳参数