# 簽名校驗規則
**短說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)