HTTP SignRESTful API 簽名認證框架
HTTP Sign 是一個RESTful API 簽名認證項目。
該項目將解決HTTP通信中的如下問題:
防止重放攻擊
防止中途篡改數(shù)據(jù)
保證請求服務冪等
從而,盡可能地讓 HTTP 通信接近安全。
HTTP Sign 的設計
字面約定
| 字面格式 | 含義 |
|---|---|
| < > | 變量 |
| [ ] | 可選項 |
| { } | 必選項 |
| | | 互斥關系 |
| 標點符號 | 本文一律采用英文標點符號 |
請求參數(shù)名,命名規(guī)則
首字母小寫,如果名稱由多個單詞組成,每個單詞的首字母要大寫
英文縮寫詞一律小寫
只能由 [A~Z]、[a~z]、[0~9] 以及字符"-"、"_"、"." 組成參數(shù)名
不能以數(shù)字開頭
不允許出現(xiàn)中文及拼音命名
術語表
| 術語 | 全稱 | 中文 | 說明 |
|---|---|---|---|
| RS | RESTful Web Services | WEB REST服務 | REST 架構風格的Web服務 |
| SecurityGroup | Security Group | 安全組 | 安全組制定安全策略 |
| GMT | Greenwich Mean Time | 格林尼治標準時間 | 指位于英國倫敦郊區(qū)的皇家格林尼治天文臺的標準時間 |
| URIPath | Uniform Resource Identifier Path | 統(tǒng)一資源標識符的路徑 | 用于標識某一互聯(lián)網(wǎng)資源路徑 |
| RFC | Request For Comments | 一系列以編號排定的文件 | 幾乎所有的互聯(lián)網(wǎng)標準都有收錄在RFC文件之中 |
相關名詞解釋
字典升序排列
如同在字典中排列單詞一樣排序,按照字母表遞增順序排列,參與比較的兩個單詞,若它們的第一個字母相同,就比較第二個字母,依此類推.
例如: zhong zhang zheng zhen, 做字典升序排列后的結果是 zhang zhen zheng zhong.冪等性
接口在設計上可以被完全相同的URL重復調(diào)用多次,而最終得到的結果是一致的.
使用限制
請求端的當前時間與服務器的當前時間之差的絕對值不能大于10分鐘,否則拒絕處理. 也就是說,請求端的時間不能比服務器時間快10分鐘或慢10分鐘,否則,服務器不受理.
請求結構
服務地址
接口按照功能劃分成了不同的功能模塊,每個模塊使用不同的域名或上下文訪問,具體域名或上下文請參考各個接口的文檔.通信協(xié)議
所有接口均采用HTTPS通信.請求方法
支持 [GET,POST,PUT,DELETE,PATCH,HEAD,OPTIONS].字符編碼
在無特別說明情況下,均使用UTF-8編碼.-
API請求結構
名稱 描述 備注 API入口 API調(diào)用的RS服務的入口 https://<domain>/path/hi公共header 每個接口都包含的通用請求頭 詳見 公共參數(shù) 公共參數(shù) 每個接口都包含的通用參數(shù) 詳見 公共參數(shù)
公共參數(shù)
公共請求頭(Common Request Headers)
| 名稱 | 是否必選 | 描述 |
|---|---|---|
| Authorization | 是 | 用于驗證請求合法性的認證信息 |
| Accept | 是 | 默認:"application/json",表示發(fā)送端(客戶端)希望從服務端接受到的數(shù)據(jù)類型 |
| Content-Length | 是 | RFC2616中定義的HTTP請求內(nèi)容長度(一般的http客戶端工具都會自動帶上這個請求頭) |
| Date | 是 | HTTP 1.1協(xié)議中規(guī)定的GMT時間,例如:Wed, 28 Mar 2018 09:09:19 GMT |
| Host | 是 | 訪問Host值(一般的http客戶端工具都會自動帶上這個請求頭) |
公共請求參數(shù)(Common Http Request Parameters)
| 名稱 | 是否必選 | 類型 | 描述 |
|---|---|---|---|
| version | 是 | String |
API 版本號,當前值為1 |
| action | 是 | String |
接口的指令名稱,如:action=myInfo |
| nonce | 是 | String |
隨機數(shù),長度范圍[8,36] |
| accessKeyId | 是 | String |
在云API密鑰上申請的標識身份的 accessKeyId,一個 accessKeyId 對應唯一的 accessKeySecret , 而 accessKeySecret 會用來生成請求簽名 Signature |
| signatureMethod | 否 | String |
簽名算法,目前支持HMACSHA256和HMACSHA1.默認采用:HMACSHA1驗證簽名 |
| token | 否 | String |
臨時證書所用的Token,需要結合臨時密鑰一起使用 |
服務端將從 QueryString 獲得這些參數(shù)。
簽名機制
用戶在HTTP請求中增加Authorization的Header來包含簽名(Signature)信息,表明這個消息已被簽名,認證是否通過,服務端說了算。
