原文:
這篇思路可以算目前主流設計方案,其中可能產生的疑惑點解析:
1、如果是web分離開發秘鑰可以採用非對稱加密;
2、安全性上面採用https(ps:在安全性要求不是非常嚴格的情況下,不用tls的「安全」,都是掩耳盜鈴)
---------------------------------------華麗的分割線----------------------------------------
1、web api的介面訪問分類
web api介面的訪問方式,大概可以分為幾類:
1)乙個是使用使用者令牌,通過web api介面進行資料訪問。這種方式,可以有效識別使用者的身份,為使用者介面返回使用者相關的資料,如包括使用者資訊維護、密碼修改、或者使用者聯絡人等與使用者身份相關的資料。
3)一種方式是提供公開的介面呼叫,不需要傳入使用者令牌、或者對引數進行加密簽名的,這種介面一般較少,只是提供一些很常規的資料顯示而已。
下面圖示就是這幾種接入方式的說明和大概應用場景。
2、web api使用安全簽名的實現
首先我們為使用者註冊的時候,需要由我們認可的終端發起,也就是它們需要進行安全簽名,後台確認簽名有效性,才能正常實現使用者註冊,否則遭到偽造資料,系統就失去原有的意義了。
/// /// 註冊使用者資訊介面
///
public inte***ce iuserapi
其實我們獲得使用者的令牌,也是需要進行使用者安全簽名認證的,這樣我們才有效保證使用者身份令牌獲取的合法性。
/// /// 系統認證等基礎介面
///
public inte***ce iauthapi
上面介紹到的引數,我們提及了幾個引數,乙個是加密簽名字串,乙個是時間戳,乙個是隨機數,乙個是應用接入id,我們一般的處理規則如下所示。
c#端**校驗如下所示。
/// /// 檢查應用接入的資料完整性
///
/// 加密簽名內容
/// 時間戳
/// 隨機字串
///
else
}#endregion
}return result;
}
第一步是驗證使用者的簽名是否符合要求,符合要求後進行使用者資訊的比對,並生成使用者訪問令牌資料json,返回給呼叫端即可。
3、web api使用安全令牌的實現
通過上面的介面,我們獲取到的使用者訪問令牌,以後和使用者相關的資訊呼叫,我們就可以通過這個令牌引數進行傳遞就可以了,這個令牌帶有使用者的一些基礎資訊,如使用者id,過期時間等等,這個token的設計思路**於json web token (jwt),具體可以參考以及github上的專案
由於web api的呼叫,都是一種無狀態方式的呼叫方式,我們通過token來傳遞我們的使用者資訊,這樣我們只需要驗證token就可以了。
jwt的令牌生成邏輯如下所示
令牌生成後,我們需要在web api呼叫處理前,對令牌進行校驗,確保令牌是正確有效的。
檢查的**,就是把令牌生成的過程逆反過來,獲取相應的資訊,並且對令牌簽發的時間進行有效性判斷,一般可以約定乙個失效時間,如1天或者7天,也不用設定太短。
/// /// 檢查使用者的token有效性
///
///
///
public checkresult validatetoken(string token)
//成功校驗
result.success = true;
result.errmsg = "";
result.userid = userid;
#endregion}}
catch (exception ex)
}return result;
}
一般來說,訪問令牌不能永久有效,對於訪問令牌的重新更新問題,可以設定乙個規則,只允許最新的令牌使用,並把它儲存在介面快取裡面進行對比,應用系統退出的時候,就把記憶體裡面的token移除就可以了。
4、asp.net web api的開發
上面我們定義了一般的web api介面,以及實現相應的業務實現,如果我們需要建立web api層,還需要構建乙個web api專案的。
建立好相應的專案後,可以為專案新增乙個web api基類,方便控制共同的介面。
然後我們就可以在controller目錄上建立更多的應用api控制器了。
最後我們為了統一所有的api介面都是返回json方式,我們需要對webapiconfig裡面的**進行設定下。
public static class webapiconfig
//",
defaults: new
);// remove the json formatter
// remove the xml formatter
config.formatters.remove(config.formatters.xmlformatter);}}
5、web api 介面的測試
接下來我們要做的就是需要增加業務介面,以便進行具體的測試了,建議使用winform專案,對每個介面進行乙個測試,或者也可以考慮使用單元測試的方式,看個人喜好吧。
例如我們如果要測試使用者登陸的介面的話,我們的測試**如下所示。
/// /// 生成簽名字串
///
/// 時間戳
/// 隨機數
private tokenresult gettokenresult()
如果我們已經獲得了令牌,我們根據令牌傳遞引數給連線,並獲取其他資料的測試處理**如下所示。
//獲取訪問令牌
如果需要post資料的話,那麼呼叫**如下所示。
//使用post方式
web api後台,會自動把post的json資料轉換為對應的物件的。
如果是get方式,我們可能可以直接通過瀏覽器進行除錯,如果是post方式,我們需要使用一些協助工具,如fiddler等處理工具,但是最好的方式是自己根據需要弄乙個測試工具,方便測試。
以下就是我為了自己web api 介面開發的需要,專門弄的乙個除錯工具,可以自動組裝相關的引數,包括使用安全簽名的引數,還可以把所有引數資料進行儲存。
api介面設計
請求模式也可以說是動作 資料傳輸方式,通常我們在web中的form有get post兩種,而在http中,存在下發這幾種。get 選擇 從伺服器上獲取乙個具體的資源或者乙個資源列表。post 建立 在伺服器上建立乙個新的資源。put 更新 以整體的方式更新伺服器上的乙個資源。patch 更新 只更新...
API介面設計
請求模式也可以說是動作 資料傳輸方式,通常我們在web中的form有get post兩種,而在http中,存在下發這幾種。get 選擇 從伺服器上獲取乙個具體的資源或者乙個資源列表。post 建立 在伺服器上建立乙個新的資源。put 更新 以整體的方式更新伺服器上的乙個資源。patch 更新 只更新...
API介面設計
目前 基本都是前後端分離的模式,如果前端使用vue等框架會產生跨域的問題,當產生跨域的時候,乙個介面會被訪問兩次,第一次會使用options訪問來判斷介面是否通,接下來才會使用指定的請求方式來訪問,那麼這樣怎麼辦呢?我們的共有controller就派上用場了,共有控制器裡面的建構函式 public ...