基於WebAPI的開放平臺架構實踐

新生代碼農如何在硝煙瀰漫的商業叢林中生存和崛起? 洞見,讓一部分先碰見將來。git

關注公衆號「碼農商業參謀",獲取更多技術乾貨和商業新風向。github

背景

隨着業務的發展,愈來愈多不一樣系統之間須要數據往來,咱們和外部系統之間產生了數據接口的對接。固然,有咱們提供給外部系統(工具)的,也有咱們調用第三方的。而這裏重點講一下咱們對外的接口。web

   目前,咱們運營和維護着諸多的對外接口,不少現有的接口服務寄宿在各個不一樣的項目,哪些應用在使用api也沒有管理起來。而且之前的調用模式也是比較複雜,排錯困難。算法

目前已經對外提供服務的有短信平臺,審覈中心,ETCP,官網系列(充值,登錄,註冊),服務中心,AuterCenter,HomeAPI(即將上線)。同時內部還有工單系統,安全中心,基礎服務,GEMC等。其餘的還有一些內部工具服務。
json

從目前的需求上看,咱們對外提供接口的需求很大。固然,可以持續對外提供服務是好事。
api

可是,對接標準不統一,服務寄宿不合理, 無文檔,無測試報告,無demo,無接口變動記錄都將致使api的可持續和可維護變得愈來愈難。
緩存

咱們將更多的考慮對外服務的安全性,高可靠性,可維護性,尤爲是離產品和用戶最近的那些API。 同時,儘可能作到全部api及其調用關係都有數據可查。所以,對於新接入的API,提供專業、規範的設計標準和文檔規範勢在必行。
安全

讓全部支撐服務化,全部服務標準化。
服務器

OPenAPI將做爲支撐的中間件,與其餘系統服務一塊兒爲運維、安全、產品和運營的各類需求提供強有力支撐。
restful




需求


1.對服務提供方(如官網服務)及其API進行管理

2.對接入的應用進行管理

  1)用戶先申請appkey,appsecrect

  2)下載sdk

  3)經過appkey,appsecrect生成token

_aop_timestamp String 否 請求時間戳

_aop_signature String 是 請求籤名

access_token String 否 用戶受權令牌 

  4)調用API

3.api規範

   1)命名規範 

      入參,返回值

      參考:

              https://developer.github.com/v3/

              http://cizixs.com/2016/12/12/restful-api-design-guide

   2)API文檔規範

4.日誌記錄

    1) API調用記錄

    2) API調用異常記錄

    3)....

5.安全

    1)參數加密

    2)IP白名單限制

    3)接口限制

6.性能

    1)客戶端緩存

    2)服務端緩存

    3)限流

      對於高頻訪問進行限制,如每一個appkley1min調用次數




使用場景

使用場景.png


架構設計


1
基礎架構


uLinker.png

2
UML設計

ulLinker_uml2_0.png


3
認證機制



驗證(Authentication)是爲了肯定用戶是其申明的身份,好比提供帳戶的密碼。否則的話,任何人僞形成其餘身份(好比其餘用戶或者管理員)是很是危險的

 這裏使用TOKEN+簽名認證 保證請求安全性

 主要原理是:

       1.作一個認證服務,提供一個認證的webapi,用戶先訪問它獲取對應的token

       2.用戶拿着相應的token以及請求的參數和服務器端提供的簽名算法計算出簽名後再去訪問指定的api

       3.服務器端每次接收到請求就獲取對應用戶的token和請求參數,服務器端再次計算簽名和客戶端簽名作對比,若是驗證經過則正常訪問相應的api,驗證失敗則返回具體的失敗信息

核心實現(含代碼片斷):

       1.用戶請求認證服務GetToken,將TOKEN保存在服務器端緩存中,並返回對應的TOKEN到客戶端(該請求不須要進行簽名認證)

        2.客戶端調用服務器端API,須要對請求進行簽名認證,簽名方式以下 

            

1

get請求:按照請求參數名稱將全部請求參數按照字母前後順序排序獲得:keyvaluekeyvalue...keyvalue  字符串如:將arong=1,mrong=2,crong=3 排序爲:arong=1, crong=3,mrong=2  而後將參數名和參數值進行拼接獲得參數字符串:arong1crong3mrong2。  

  post請求:將請求的參數對象序列化爲json格式字符串

2

在請求頭中添加timespan(時間戳),nonce(隨機數),appkey,appsecrect,signature(簽名參數)

3

根據請求參數計算本次請求的簽名,用timespan+nonc+appkey+appsecrect+token+data(請求參數字符串),獲得signStr簽名字符串,而後再進行排序和MD5加密獲得最終的signature簽名字符串,添加到請求頭中

4

webapi接收到相應的請求,取出請求頭中的timespan,nonc,appkey,appsecrect,signature 數據,根據timespan判斷這次請求是否失效,根據appkey+appsecrect取出相應token判斷token是否失效,

根據請求類型取出對應的請求參數,而後服務器端按照一樣的規則從新計算請求籤名,判斷和請求頭中的signature數據是否相同,若是相同的話則是合法請求,正常返回數據,若是不相同的話,

該請求可能被惡意篡改,禁止訪問相應的數據,返回相應的錯誤信息 

參與簽名的TOKEN,整個過程當中TOKEN是不參與通訊的,因此只要保證TOKEN不泄露,請求就不會被僞造。

而後咱們經過timestamp時間戳用來驗證請求是否過時,這樣就算被人拿走完整的請求連接也是無效的。

Sign簽名的方式可以在必定程度上防止信息被篡改和僞造,保障通訊的安全。        


4
受權

(Authorization)是爲了保證用戶有對請求資源特定操做的權限。好比用戶的私人信息只能本身能訪問,其餘人沒法看到;有些特殊的操做只能管理員能夠操做,其餘用戶有隻讀的權限等等

       1.IP白名單限制,平臺服務只能接受指定IP來源的app發起的請求

       2.api限制,指定app只能訪問受權訪問的api



5
Token緩存設計

服務端token視角.png

服務端視角


客戶端token視角.png

客戶端視角


6
限流

若是對訪問的次數不加控制,極可能會形成 API 被濫用,甚至被 DDos 攻擊。根據使用者不一樣的身份對其進行限流,能夠防止這些狀況,減小服務器的壓力。好比能夠設置,用戶每一個小時容許發送請求的最大值


7
壓測

1.本身寫程序,開啓多線程發起模擬請求

2.壓測工具,如loadrunner


總結

此次開放平臺實踐的初版已經投入使用,不斷完善中。整體來看,收穫頗多,同時也是實現"中臺戰略"真正走出的第一步。

商業參謀.jpg

相關文章
相關標籤/搜索