# 签名校验规则
**短说OSX**与开发者之间进行接口交互请求,都会包含签名参数,链接中签名参数的生成,都是通过MD5生成的签名参数,以确保请求安全。
针对开发者提供的接口,开发者需要在相应的接口中进行MD5鉴权,确保请求来源可信。
### 1.请求有效期校验
请求有效期校验原理如下:
OSX向开发者接口发起请求都会以GET方式传递“endtimestamp”参数,该参数标识了请求的有效期。1970-01-01开始的时间戳,秒为单位。
PHP中校验方式如下:
```
<pre class="calibre26">
```
$endtimestamp=intval($_GET['endtimestamp']);
if($endtimestamp>time()){
$this->apiError('请求超时');//请求超时,不做处理
}
```
```
### 2.请求签名校验
将请求参数和appSecret封装成Map集合(如接口文档中无特殊说明,默认除sign外所有请求参数参与签名),按照**参数名**(Key)进行升序排列,将排序后Map集合的参数值(value)拼装成字符串进行MD5签名。其中appSecret在签名中的顺序取决于他在所有参数名中的顺序。
以用户信息获取接口为例: `appKey:testappkey , appSecret:testsecret`
参数列表:`{appKey=testappkey,endtimestamp=1405495206,user_token=213434313,sign=498f48a01afe94853fe8be954bb7bd67}`
签名原串:`testappkeytestsecret1405495206213434313`
签名后字符串:`498f48a01afe94853fe8be954bb7bd67`
签名后字符串和sign做比较,相同则验证通过,不同则验证失败。
PHP中校验方式如下:
```
<pre class="calibre26">
```
$default_appKey='testappkey';
$default_appSecret='testsecret';
$Map=[
'appKey' => $_GET['appKey'],
'appSecret' => $default_appSecret,
'endtimestamp' => $_GET['endtimestamp'],
'user_token' => $_GET['user_token']
];
$sign = $_GET['sign'];
$endtimestamp=intval($Map['endtimestamp']);
if($endtimestamp>time()){
$this->apiError('请求超时');//请求超时,不做处理
}
if($Map['appKey']!=$default_appKey){
$this->apiError('参数错误,秘钥key不正确');//参数错误,秘钥key不正确
}
ksort($Map);//$Map按 键 升序排列
$before_md5_sign=implode('',$Map);//拼接$Map为字符串
$after_md5_sign=md5($before_md5_sign);//MD5加密
if($after_md5_sign!=$sign){
$this->apiError('签名验证不通过');//签名验证不通过
}
//签名通过后的后续业务逻辑代码
$data=array();
……
……
$this->apiSuccess($data);
```
```
#### 注意:
\> 1.签名验证时,如接口参数列表中无特殊说明,必须遍历request请求中的所有参数进行签名验证。 > 短说向开发者发起的请求,也会带上签名,开发者可在提供的api中进行签名验证,确保请求来源可信。
\> 2.示例中$this->apiError("errorInfo");方法是OSX封装的方法,主要实现返回json数据:(开发者需自己处理,保证返回结构中,msg的值为fail,data的值为错误描述)
```
<pre class="calibre26">
```
{
"code":200,
"msg":"error",
"data":"errorInfo"
}
```
```
\> 3.示例中$this->apiSuccess($data);方法是OSX封装的方法,主要实现返回json数据:(开发者需自己处理,保证返回结构中,msg的值为ok,data的值为要返回的json格式的数据信息)
```
<pre class="calibre26">
```
{
"code":200,
"msg":"ok",
"data":json_data//这里数组结构的$data在apiSuccess方法中会被处理成json格式
}
```
```
## 签名生成工具
为方便开发同学理解签名校验规则,可以使用下面的短说OSX签名工具页面进行校验签名的正确性。地址如下:[签名校验工具](https://osxbe.demo.opensns.cn/commonapi/index/checkTokenSign)