以前簡單介紹過web api 的設計,但是還是有很多朋友問我,如何合理的設計和實現web api。比如,介面安全,異常處理,統一資料返回等問題。所以有必要系統的總結總結 web api 的設計和實現。由於前面已經介紹過web api 的引數和返回格式的設計,《web api系列(一)設計經驗與總結》。
這次,就來講講介面安全。
由於web api是基於網際網路的應用,因此安全性要遠比在本地訪問資料庫的要嚴格的多,一般通用的做法,是採用幾步來保證介面和資料安全:
1.首先乙個是基於ca證書的https進行資料傳輸,防止資料被竊聽;
2.然後是採用引數加密簽名方式傳遞,對傳遞的引數,增加乙個加密簽名,在伺服器端驗證簽名內容,防止被篡改;
3.最後是對一般的介面訪問,都需要使用使用者身份的token進行校驗,只要檢查通過才允許訪問資料。
web api介面的訪問方式,大概可以分為幾類:
1)使用使用者名稱密碼。這種方式比較簡單,可以有效識別使用者的身份(如包括使用者資訊、密碼、或者相關的介面許可權等等)。驗證成功後,返回相關的資料。
3)公開的介面呼叫,不需要傳入使用者令牌、或者對引數進行加密簽名的,這種介面一般較少,只是提供一些很常規的資料顯示而已。
web api 安全校驗
使用使用者名稱密碼的實現方式比較簡單,這裡就不說明如何實現了。就講一講安全簽名的實現。由於web api的呼叫,都是一種無狀態的呼叫方式,所有的介面請求,都要帶安全簽名。
web api核心安全校驗**片斷:
publicclass
querydata
public querydata(ienumerablestring, string>>paramlist)
foreach (var param in
paramlist)
}catch
(exception ex)
}//採用排序的dictionary的好處是方便對資料報進行簽名,不用再簽名之前再做一次排序
private sorteddictionary m_values = new sorteddictionary();
/*** 設定某個欄位的值
* @param key 欄位名
* @param value 字段值
*/public
void setvalue(string key, object
value)
/*** 根據欄位名獲取某個欄位的值
* @param key 欄位名
* @return key對應的字段值
*/public
object getvalue(string
key)
/*** 判斷某個字段是否已設定
* @param key 欄位名
* @return 若欄位key已被設定,則返回true,否則返回false
*/public
bool isset(string
key)
public
string
tourl()
if (pair.key != "
sign
" && pair.value.tostring() != ""
)
}buff = buff.trim('&'
);
return
buff;
}public
test")
//所有字元轉為大寫
return
sb.tostring().toupper();
}public
bool
checksign()
//如果設定了簽名但是簽名為空,則拋異常
else
if (getvalue("
sign
") == null || getvalue("
sign
").tostring() == ""
)
//獲取接收到的簽名
string return_sign = getvalue("
sign
").tostring();
//在本地計算新的簽名
string cal_sign =makesign();
if (cal_sign ==return_sign)
return
false
; }
}
Web Api 2 介面API文件美化
使用用第三方提供的swgger ui 幫助提高 web api 介面列表的閱讀性,並且可以在頁面中測試服務介面。執行程式如下 注意 在ie中必須輸入紅色部分。並且可以對方法進行測試。在開發web api 是可以寫清楚注釋,並且在文件中可以全部的顯示出來。在工程中處了安裝swashbuckle 以外,...
4 介面繫結 多參傳遞
後面 mybatis 和 spring 整合時使用的是這個方案 實現步驟 實現步驟 name namespace selall resulttype log select from log select 多引數實現辦法 selbyaccinaccout resulttype log select f...
學習筆記 系列九 介面測試
在軟體進行測試時,為了驗證軟體對外的介面服務是否可以正常提供服務及軟體在不同場景中執行路徑的安全性和可操作性,需要對介面進行測試。介面測試 inte ce testing 的目的是測試與系統相關聯的外部介面,測試的重點是檢查資料的互動,傳遞和控制管理過程,提供測試質量和測試覆蓋,更好地重新軟體缺陷和...