# 簽名機制
API 網關會對每個訪問的請求進行身份驗證,所以無論使用 HTTP 還是 HTTPS 協議提交請求,都需要在請求中包含簽名(api_sign)信息。
AppNode 使用 SignKey 簽名密鑰對請求 URL 進行簽名加密以驗證請求的有效性,請勿泄露簽名密鑰。
## 獲取簽名密鑰
### 在面板上獲取簽名密鑰
請參考:[獲取 API 網關地址](agent/publish-agent-api.md)
### 通過命令行獲取簽名密鑰
使用 `appnode agent config agent_sign_key` 命令即可獲得受控端的 API 簽名密鑰:
```bash
# appnode agent config agent_sign_key
agent_sign_key : 95bAzsK4AuYbrEnFjfUGdku5CXz2yKJn
```
## 簽名操作
在進行 API 請求時,需要按照以下方法對請求進行簽名處理:
1. 對請求參數進行排序,排序規則:
* 按參數名的字典順序排序
* 如果有多個相同參數名的參數,則按參數值的字典順序排序
2. 按以下方式連接排序后的參數名和參數值,得到待簽名字符串:
`URLENCODE(參數名1)=URLENCODE(參數值1)&URLENCODE(參數名2)=URLENCODE(參數值2)&...`
即先使用 `URLENCODE()` 對參數名和參數值進行 URL 編碼,然后用 `&` 符號連接起來。
3. 對第2步得到的待簽名字符串,計算出 HMAC-MD5 值,以字符串形式輸出,即為簽名值。使用 HMAC-MD5 算法計算簽名時使用的 Key 就是 API 簽名密鑰;
4. 將得到的簽名值,作為 api_sign 參數添加到請求參數中,即完成對請求簽名的過程。
### 示例
以系統信息應用的 `Status.Overview` 接口為例,假設受控端使用的 API 接口密鑰為 `95bAzsK4AuYbrEnFjfUGdku5CXz2yKJn`。 那么簽名前的請求 URL 為:
```raw
http://192.168.1.128/?api_action=Status.Overview&api_agent_app=sysinfo&api_format=json
&api_lang=zh_cn&api_timestamp=1515502060&api_nonce=8YyjYz9t6H3ZVraY
```
計算得到的待簽名字符串為:
```raw
api_action=Status.Overview&api_agent_app=sysinfo&api_format=json&api_lang=zh_cn&api_nonce=8YyjYz9t6H3ZVraY&api_timestamp=1515502060
```
使用簽名密鑰 `95bAzsK4AuYbrEnFjfUGdku5CXz2yKJn` 計算 HMAC-MD5,計算得到的簽名值為:
`08ce8db013695057ef53b04e61ba3c76`
將簽名作為 `api_sign` 參數加入到 URL 請求中,最后得到的 URL 為:
```raw
http://192.168.1.128/?api_action=Status.Overview&api_agent_app=sysinfo&api_format=json
&api_lang=zh_cn&api_timestamp=1515502060&api_nonce=8YyjYz9t6H3ZVraY&api_sign=08ce8db013695057ef53b04e61ba3c76
```