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