一致性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; }