3條原則,16 個(gè)小點(diǎn),幫你寫出一個(gè)優(yōu)秀的對(duì)外接口!
點(diǎn)擊下方“IT牧場(chǎng)”,選擇“設(shè)為星標(biāo)”

來源:blog.csdn.net/weixin_42304845/article/
details/109305740
對(duì)外API接口設(shè)計(jì)
安全性 1、創(chuàng)建appid,appkey和appsecret 2、Token:令牌(過期失效) 3、Post請(qǐng)求 4、客戶端IP白名單 (可選) 5、單個(gè)接口針對(duì)IP限流(令牌桶限流,漏桶限流,計(jì)數(shù)器限流) 6、記錄接口請(qǐng)求日志 7、采用Https 8、數(shù)據(jù)合法性校驗(yàn) 9、密碼查詢(加緩存,key使用客戶號(hào)) 10、接口調(diào)用失敗告警 11、高可用:服務(wù)器集群部署(2-3) 12、變更軌跡,保存上次密碼? 13、查詢密碼和交易密碼是否分兩條? 冪等性 數(shù)據(jù)規(guī)范 版本控制 響應(yīng)狀態(tài)碼規(guī)范 統(tǒng)一響應(yīng)數(shù)據(jù)格式
安全性
1、創(chuàng)建appid,appkey和appsecret
appid:應(yīng)用的唯一標(biāo)識(shí) appkey:公鑰=賬號(hào) appsecret:私鑰=密碼
1、設(shè)計(jì)一個(gè)認(rèn)證系統(tǒng),專用于創(chuàng)建第三方接入應(yīng)用的賬號(hào)信息,用于生成appid,appkey和appsecret,然后發(fā)appkey和appsecret給第三方接入應(yīng)用,用于做認(rèn)證
ps:appkey和appsecret成對(duì)出現(xiàn)的機(jī)制,目的在于首次驗(yàn)證(類似登錄場(chǎng)景),用來申請(qǐng)一個(gè)token,之后請(qǐng)求數(shù)據(jù)請(qǐng)求,就直接帶token請(qǐng)求服務(wù)端認(rèn)證即可。
2、第三方接入應(yīng)用自行注冊(cè),需要校驗(yàn)企業(yè)信息合法性(暫不考慮)

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


統(tǒng)一響應(yīng)數(shù)據(jù)格式
為了方便給客戶端響應(yīng),響應(yīng)數(shù)據(jù)會(huì)包含三個(gè)屬性,狀態(tài)碼(code)、信息描述(message)、響應(yīng)數(shù)據(jù)(data)。客戶端根據(jù)狀態(tài)碼及信息描述可快速知道接口,如果狀態(tài)碼返回成功,再開始處理數(shù)據(jù)。
響應(yīng)結(jié)果定義及常用方法:


干貨分享
最近將個(gè)人學(xué)習(xí)筆記整理成冊(cè),使用PDF分享。關(guān)注我,回復(fù)如下代碼,即可獲得百度盤地址,無套路領(lǐng)取!
?001:《Java并發(fā)與高并發(fā)解決方案》學(xué)習(xí)筆記;?002:《深入JVM內(nèi)核——原理、診斷與優(yōu)化》學(xué)習(xí)筆記;?003:《Java面試寶典》?004:《Docker開源書》?005:《Kubernetes開源書》?006:《DDD速成(領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)速成)》?007:全部?008:加技術(shù)群討論
加個(gè)關(guān)注不迷路
喜歡就點(diǎn)個(gè)"在看"唄^_^
