標籤:factory actor art ssr post ram nbsp bapi web
目前移動端流行 ,本文章主要介紹本人(新手) 開發 與app對接服務端 進行分享 。不足之處請指正
與app對接 一般的網站介面 需映射外網(即外部網路可以直接存取該介面項目),那麼 這就要考慮到項目的資料保密性和一些驗證。
目前 我做的介面中所用到了 如下技術:
1:資料的加密/解密: 資料在傳輸過程中 需要進行加解密操作 才能有效保護資料的安全性 (我的項目中採用.net framwork 內建的aes 加解密)
2:簽名驗證:即 app端將資料進行 無法復原加密 然後 放在http請求的header中 ,服務端 擷取到 資料 採用相同的無法復原加密方式進行獲得 密文 ,將app的密文和服務端解析的密文進行匹配 (可在一定程度上保護資料不被篡改)
3:時間戳記驗證:app端 在http請求中 加入時間戳記 資料 ,服務端擷取時間戳記 ,去驗證 app的時間戳記 與伺服器端 設定的時間戳記 ,防止重放攻擊
4:登入時效驗證:在每次登入時 產生一個唯一的token驗證碼 儲存在資料庫中 ,並將該 token返回至APP ,app每次請求資料 去驗證 token是否 已淘汰,如果過時 重新登入
在 項目開發過程中 對於以上的驗證 建議統一處理
1:在請求資料進入時 統一進行 參數的解密和驗證
方法:統一解密 webapi 項目 可以繼承類 MessageProcessingHandler 並重寫 ProcessRequest 和 ProcessResponse 方法
在該ProcessRequest 方法中進行資料的解密
在該ProcessResponse 方法中進行資料的加密
2.資料驗證 繼承 類 DelegatingHandler ,並重寫 SendAsync 方法 進行 資料的相關驗證, 一般 如果驗證 通過 結果直接 return base.SendAsync(request, token); 即 最終的效果為 將訊息分發到 對應的介面中 進行處理
如果驗證不通過 可 直接採用如下方式直接 返回資訊
/// <summary>
/// 返回用戶端錯誤資訊
/// </summary>
/// <param name="request">http請求</param>
/// <param name="needEncrypt">是否加密響應資訊</param>
/// <param name="errorMessage">錯誤資訊</param>
/// <returns>
/// 非同步方式返回的錯誤訊息
/// </returns>
private Task<HttpResponseMessage> GenerateErrorResponse(HttpRequestMessage request,
bool needEncrypt,
string errorMessage = "請求參數錯誤")
{
// 記錄錯誤的請求日誌
LogErrorRequest(request);
// 建置錯誤響應訊息
var response = new HttpResponseMessage();
var error = JsonConvert.SerializeObject(new ApiResult() { Message = errorMessage });
response.Content = new StringContent(error, Encoding.GetEncoding("UTF-8"), "application/json");
response.StatusCode = System.Net.HttpStatusCode.OK;
if(needEncrypt)
response.Content.Headers.Add("toencrypt", "");
return Task<HttpResponseMessage>.Factory.StartNew(() => response);
}
webapi服務端對接app