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