一致性api算法

来自技术开发小组内部wiki
2015年11月4日 (三) 11:10Sundianlin讨论 | 贡献的版本

(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)
跳转至: 导航搜索

算法描述

    查找 appkey 对应的app secrect,并对queryString + appkey +expire 进行排序后 求md5 hash 生成  sign 签名
   服务层收到请求时对数据进行校验,先检查参数,然后检查超时,检查签名  成功返回数据 不成功返回错误代码。

php生成签名算法

 public function calc_sign($queryString, $appkey) {
 $secret = $this->appkeys[$appkey];
 $expire = time() + 300;
 $queryString['expire'] = $expire;
 $queryString['appkey'] = $appkey;
 ksort($queryString);
 $tmp = '';
 foreach ($queryString as $k => $v) {
 $tmp .= $k . '=' . $v;
 }
 $queryString['sign'] = md5($tmp . $secret);
 return $queryString;
 }


php校验签名算法

 public function filter() {
 $queryData = $_GET;
 if (!isset($queryData['sign'], $queryData['appkey'], $this->appkeys[$queryData['appkey']])) {

 return self::CODE_AUTH_FAILED;
 }

 // 过期时间,例如:time()+300 5分钟过期
 if (isset($queryData['expire']) && $queryData['expire'] < time()) {
 return self::CODE_SESSION_EXPIRED;
 }

 $sign = $queryData['sign'];

 // 去除一些非必须的附加参数
 unset($queryData['sign'], $queryData['callback'], $queryData['_']);

 ksort($queryData);
 $tmp = '';
 foreach ($queryData as $k => $v) {
 $tmp .= $k . '=' . $v;
 }

 if ($sign != md5($tmp . $this->appkeys[$queryData['appkey']])) {
 return self::CODE_AUTH_FAILED;
 }

 $this->isCheckedSign = true;
 }