當妳的公司規模壯大了,這個時候可能會有公司開始找妳做技術對接,妳會提供api接口。這時候應該如何設計和保證API接口的安全性呢?
最常用的方案有兩種主要類型:
其中,令牌方案是web上使用最廣泛的接口認證方案。記得之前寫過壹篇文章《教妳如何使用JWT實現單點登錄》,裏面有詳細介紹。感興趣的朋友可以看看。不懂也沒關系。這裏簡單介紹壹下令牌方案。
從上圖中,我們可以清楚地看到,令牌方案的實現主要包括以下步驟:
在實際使用過程中,當用戶登錄成功後,生成的令牌在redis存儲時是有時間限制的,壹般設置為2小時,2小時後會自動失效。這時候就需要重新登錄,重新獲取壹個有效的令牌。
Token方案是目前業務類型中應用最廣泛的方案,實用性很強,可以有效防止黑客抓取包和抓取數據。
但是令牌方案也有壹些缺點!最明顯的就是當妳和第三方公司接口的時候,當妳的接口請求非常大的時候,這個時候token突然失效,會有大量的接口請求失敗。
對此我深有體會。記得很早的時候,我在和壹家中大型互聯網公司調試的時候,他們給我提供的接口對接方案是token方案。當時我們公司流量高峰期,我讓他們的接口報了大量錯誤。原因是令牌失敗了。當令牌失敗時,我們會調用它們來刷新令牌接口。刷新完成後,在令牌失效到令牌刷新的時間間隔內,會有大量失敗的請求,所以我不建議妳在實際的API對接過程中采用令牌方案。
接口簽名,顧名思義就是通過壹些簽名規則對參數進行簽名,然後將簽名信息放入請求頭中。服務器收到客戶端的請求後,只需要按照設定的規則產生相應的簽名字符串,並與客戶端的簽名信息進行比較。如果壹致,則進入業務處理流程。如果沒有通過,會提示簽名驗證失敗。
在接口簽名方案中,主要有四個核心參數:
其中,簽名生成規則分為兩步:
參數2的加密結果就是我們想要的最終簽名字符串。
接口簽名方案,特別是在大量接口請求的情況下,仍然非常穩定。
換句話說,您可以將接口簽名視為令牌方案的補充。
但如果妳想把接口簽名方案擴展到前端對接,答案是:不適合。
因為簽名計算非常復雜,其次很容易泄露appsecret!
說了這麽多,還是跟著節目壹起練吧!
如前所述,令牌方案的關鍵點在於,當用戶登錄成功後,我們只需要生成相應的令牌,然後返回給前端,下次請求業務接口時需要帶上令牌。
具體做法也可以分為兩種:
接下來,我們介紹第二個實現。
首先,編寫壹個jwt工具。
然後,當我們登錄時,我們生成壹個令牌並將其返回給客戶端。
最後,編寫壹個統壹的攔截器來驗證客戶端傳入的令牌是否有效。
在生成令牌的時候,我們可以在令牌中存儲壹些基本的用戶信息,比如用戶ID、用戶名等,這樣在令牌被認證之後,我們只需要解析裏面的信息就可以得到對應的用戶ID,這樣就可以省去在數據庫中查詢壹些基本信息的操作。
同時在使用過程中,盡量不要存儲敏感信息,因為容易被黑客分析!
同理,從服務器驗證的角度,我們可以先寫壹個簽名攔截器來驗證客戶端傳入的參數是否合法,只要有壹項不合法,我們就會提示錯誤。
具體編碼做法如下:
簽名工具類簽名:
簽名計算可以改成hamc方法,思路基本相同。
上述令牌和接口簽名方案可以保護所提供的接口,以防止其他人篡改請求或模擬請求。
但是對數據本身缺乏安全保護,即請求的參數和返回的數據可能被他人截獲,而這些數據是明文的,所以只要被截獲,就可以獲取相應的業務數據。
在這種情況下,建議您加密請求參數和返回參數,如RSA、AES和其他加密工具。
同時在生產環境中,使用https進行傳輸可以起到很好的安全防護作用!