|
來源:blog.csdn.net/weixin_42304845/article/details/109305740對外API接口設計
安全性1、創(chuàng)建appid,appkey和appsecret
1、設計一個認證系統(tǒng),專用于創(chuàng)建第三方接入應用的賬號信息,用于生成appid,appkey和appsecret,然后發(fā)appkey和appsecret給第三方接入應用,用于做認證
2、第三方接入應用自行注冊,需要校驗企業(yè)信息合法性(暫不考慮) 2、Token:令牌(過期失效)1、第三方接入應用獲取第一步中的appkey和appsecret 2、請求認證系統(tǒng)獲取nonce隨機數(shù),服務端在緩存中存放下nonce 3、客戶端拿到這個隨機數(shù)后將其與appsecret拼接生appsecretStr,然后調(diào)用生成簽名方法,傳入appsecretStr,appkey,nonce,url(備注:可轉大寫,轉小寫,追加特殊字符,然后加密)進行非可逆加密(MD5/SHA1等),生成簽名A。接著構造請求把簽名放到請求頭signature,post請求體中放入?yún)?shù):appkey,nonce,timestamp,url根據(jù) 4、認證系統(tǒng)獲取請求后,查詢根據(jù)appkey查詢緩存中的nonce,判斷是否存在,不存在則提示不合法請求;判斷是否相等,不等則為惡意請求。 判斷timestamp的時效性,防止惡意請求:數(shù)據(jù)包中的客戶端時間戳字段,然后用服務器當前時間去減客戶端時間,看結果是否在一個區(qū)間內(nèi)。 先根據(jù)appkey查詢數(shù)據(jù)庫,判斷是否存在,如不存在則提示不合法用戶;反之,查出appsecret,按照客戶端的簽名加密方式,進行加密,生成簽名B,比較A和B,如果一樣則生成token,失效緩存中的nonce,返回token。 3、Post請求4、客戶端IP白名單 (可選)5、單個接口針對IP限流(令牌桶限流,漏桶限流,計數(shù)器限流)限流是為了更好的維護系統(tǒng)穩(wěn)定性。使用redis進行接口調(diào)用次數(shù)統(tǒng)計,ip+接口地址作為key,訪問次數(shù)作為value,每次請求value+1,設置過期時長來限制接口的調(diào)用頻率 6、記錄接口請求日志使用aop全局記錄請求日志,快速定位異常請求位置,排查問題原因。 7、采用Https1、服務端配置SSL證書 2、客戶端調(diào)用https工具類忽略服務端證書校驗 8、數(shù)據(jù)合法性校驗9、密碼查詢(加緩存,key使用客戶號)1、密碼更新時,更新redis; 2、緩存查不到,查數(shù)據(jù)庫,同時更新緩存; 3、密碼在緩存和數(shù)據(jù)庫都需要加密,返回時才解密(或者是返回客戶端時,客戶端自行解密) 10、接口調(diào)用失敗告警11、高可用:服務器集群部署(2-3)客戶端重試機制 12、變更軌跡,保存上次密碼?13、查詢密碼和交易密碼是否分兩條?冪等性冪等性是指任意多次請求的執(zhí)行結果和一次請求的執(zhí)行結果所產(chǎn)生的影響相同。說的直白一點就是查詢操作無論查詢多少次都不會影響數(shù)據(jù)本身,因此查詢操作本身就是冪等的。但是新增操作,每執(zhí)行一次數(shù)據(jù)庫就會發(fā)生變化,所以它是非冪等的。 冪等問題的解決有很多思路,這里講一種比較嚴謹?shù)?。提供一個生成隨機數(shù)的接口,隨機數(shù)全局唯一。調(diào)用接口的時候帶入隨機數(shù)。 第一次調(diào)用,業(yè)務處理成功后,將隨機數(shù)作為key,操作結果作為value,存入redis,同時設置過期時長。 第二次調(diào)用,查詢redis,如果key存在,則證明是重復提交,直接返回錯誤。 數(shù)據(jù)規(guī)范版本控制一套成熟的API文檔,一旦發(fā)布是不允許隨意修改接口的。這時候如果想新增或者修改接口,就需要加入版本控制,版本號可以是整數(shù)類型,也可以是浮點數(shù)類型。一般接口地址都會帶上版本號, 響應狀態(tài)碼規(guī)范![]() ![]() 統(tǒng)一響應數(shù)據(jù)格式為了方便給客戶端響應,響應數(shù)據(jù)會包含三個屬性,狀態(tài)碼(code)、信息描述(message)、響應數(shù)據(jù)(data)。客戶端根據(jù)狀態(tài)碼及信息描述可快速知道接口,如果狀態(tài)碼返回成功,再開始處理數(shù)據(jù)。 響應結果定義及常用方法: ![]() ![]() |
|
|
來自: 昵稱10087950 > 《JAVA》