一:常見(jiàn)的HTTP鑒權(quán)協(xié)議
??????? REST表述性狀態(tài)轉(zhuǎn)移(Representational State Transfer),是基于HTTP的web服務(wù)設(shè)計(jì)風(fēng)格,一個(gè) RESTFUL API 是無(wú)狀態(tài)的,這意味著認(rèn)證請(qǐng)求應(yīng)當(dāng)不能依賴(lài)于cookie或session。
??????? 常見(jiàn)的HTTP鑒權(quán)方法有:
??????? HTTP BASIC
??????? 將用戶信息以base64編碼放入header中,后端直接從header中取出Authorization,然后進(jìn)行base解碼。在不使用HTTPS協(xié)議的情況?,安全性很低。
??????? HTTP DIGEST
??????? 客戶端先發(fā)送一次請(qǐng)求,服務(wù)端認(rèn)證失敗返回401并附加一個(gè)唯一性的nonce編碼,客戶端收到401信息,將nonce編碼,用戶信息,請(qǐng)求參數(shù)生成摘要(通常為MD5)信息,客戶端附帶摘要信息,再次發(fā)送請(qǐng)求。
??????? 安全性比HTTP BASIC高,由于nonce編碼的唯一性可以防止重放攻擊。但是客戶端需要發(fā)送兩次請(qǐng)求,而且每種web服務(wù)器和客戶端環(huán)境對(duì)HTTP DIGEST的支持方式和支持程度不一致。
? ? ? ? OAUTH2
??????? 更關(guān)注授權(quán)操作,而不是鑒權(quán)。更多使用與第三方授權(quán),比如通過(guò)QQ用戶信息更登陸簡(jiǎn)書(shū)就可以使用OAUTH2協(xié)議。常用的鑒權(quán)框架spring security、shiro都支持這種協(xié)議的集成。
二:API ID+HMAC鑒權(quán)方式
??????? 1、appId:是用于確定客戶端的唯一性標(biāo)示符。
??????? 2、HMAC :是基于散列的消息認(rèn)證碼(Hash-based MessageAuthentication Code)。
??????? 3、appKey: 秘鑰,用于HMAC算法生成數(shù)字摘要,秘鑰由服務(wù)端生成,一個(gè)appId對(duì)應(yīng)一個(gè)秘鑰。
??????? 4、客戶端持有API ID和APP KEY。
??????? 5、每次請(qǐng)求前,將請(qǐng)求參數(shù)的名稱(chēng)按照自然順序進(jìn)行排序,然后依次取出這些參數(shù)的值進(jìn)行連接字符串操作生成baseString,將appId,timestamp(當(dāng)前時(shí)間戳精度為毫秒)也連接到baseString后面。使用HMAC摘要算法和秘鑰APP KEY生成數(shù)組摘要digest。
? ? ? ? 6:客戶端發(fā)送請(qǐng)求時(shí)將apiId、timestamp、digest三個(gè)參數(shù)帶著,如GET方式的請(qǐng)求:parameter1=p1¶meter2=p2&apiId=API KEY&digest=digest×tamp=timestamp。如果您想要參數(shù)不可見(jiàn)可以使用AES進(jìn)行加密傳輸。
? ? ? 7:服務(wù)端驗(yàn)證,首先要求apiId、digest、timestamp三個(gè)參數(shù)不能為空,然后用和客戶端生成摘要相同的步驟生成服務(wù)端摘要,與客戶端傳入的摘要相比較,并從數(shù)據(jù)庫(kù)已使用過(guò)的摘要,檢查此摘要是否是使用過(guò)的,兩個(gè)摘要比對(duì)進(jìn)行驗(yàn)簽,驗(yàn)簽成功后將摘要存入已用摘要表。
三、小結(jié)
這種鑒權(quán)處理方式的特點(diǎn):
1、不在網(wǎng)絡(luò)上傳遞用戶口令。
2、請(qǐng)求參數(shù)進(jìn)行加密傳輸,防止敏感信息外泄。
3、采用HMAC摘要防篡改。
4、摘要中加入時(shí)間戳,每個(gè)摘要只允許使用一次,防止重放攻擊。
jsets-shiro-spring-boot-starter中封裝了HMAC的鑒權(quán),請(qǐng)參見(jiàn):
項(xiàng)目文檔、源碼
項(xiàng)目中經(jīng)常用到的功能比如:驗(yàn)證碼、密碼錯(cuò)誤次數(shù)限制、賬號(hào)唯一用戶登陸、動(dòng)態(tài)URL過(guò)濾規(guī)則、無(wú)狀態(tài)鑒權(quán)等等jsets-shiro-spring-boot-starter對(duì)這些常用的功能進(jìn)行了封裝和自動(dòng)導(dǎo)入,少量的配置就可以應(yīng)用在項(xiàng)目中。
1、jsets-shiro-spring-boot-starter項(xiàng)目詳情請(qǐng)參見(jiàn):jsets-shiro-spring-boot-starter
2、應(yīng)用示例源碼請(qǐng)參見(jiàn):jsets-shiro-demo
3、jsets-shiro-spring-boot-starter使用說(shuō)明請(qǐng)參見(jiàn):使用說(shuō)明