最近在作API的權限設計這一塊,作一次權限設計的總結。算法
1. 假設咱們須要訪問的API接口是這樣的:http://xxxx.com/openapi/v1/get/user/?key=xxxxx&sign=sadasdas×tamp=2013-03-05 10:14:00&c=c&a=a&d=d數據庫
2. 接口調用的控制器:openapi/v1/get/user/api
3. 步驟一:做爲服務端,首先要檢查參數是否正確:key (用戶的key) ;sign(加密的簽名串) ;timestamp (請求的時間,服務端對請求有時間生效),這些參數若是有一個參數沒傳遞,確定返回參數不正確的結果。安全
4. 步驟二:參數若是都傳遞正確,這個時候須要檢查API的白名單權限,API也就是(openapi/v1/get/user/)是否存在在咱們的數據庫中,通常會有一張API的數據表,若是調用的API不在咱們的數據庫白名單中或者這個API已經關閉訪問了,那麼要返回禁止訪問的結果。加密
5. 步驟三: 若是API在白名單中,那麼如今就要檢查用戶的KEY是否正確了,服務端會有一張用戶權限表,這個數據表主要用來記錄用戶的key secret(密鑰) 以及API權限列表,檢查這個用戶對訪問的API(openapi/v1/get/user/)是否有權限,若是有權限則經過,沒權限則關閉。設計
6. 步驟四: 若是用戶權限經過,這個時候就到了最重要的一步,SIGN簽名的驗證。排序
簽名算法:接口
加密方式 md5(POST參數(升序排序,除key sign參數除外) + 用戶密鑰) md5
注意:加密的時候,須要將timestamp帶上,防止客戶端篡改。get
客戶端,將本身須要傳遞的參數進行升序排序,而後加上本身key對應的密鑰(密鑰在服務端數據庫中有一份保存,這個是不能對外公開的)進行MD5加密,經過參數sign傳遞到服務端。
服務端拿到sign值後,對傳遞過來的參數也進行一樣的算法排序,並通過用戶的key查詢獲得密鑰,而後進行一次加密算法,獲得的服務端的sign和客戶端傳遞過來的sign進行比較,若是相同則表示是能夠經過的,若是中途有人篡改數據等,那麼最終加密出來的sign就是不一致的,這樣保證了用戶傳遞數據的可靠性和安全性。
7. 步驟五:檢查時間戳時間,比較客戶端時間和服務端時間是否在10分鐘以內,若是10分鐘以外了,那麼返回超時的提示,這樣能保證調用過的接口數據能在必定時間內銷燬掉。
8. 步驟六:調用相應邏輯