JWT:JSON Web Token是目前最流行的跨域認(rèn)證解決方案,用戶身份的認(rèn)證以前我們都是怎么做的呢骑晶,一般步驟都是這樣的:用戶將用戶名及密碼傳輸?shù)椒?wù)器,服務(wù)器認(rèn)證通過后將用戶相關(guān)信息保存到session中,然后返回session_id將其寫到用戶的cookie中盒件,用戶后面所有請求都會(huì)通過cookie將session_id傳輸?shù)胶笈_(tái),后臺(tái)通過session_id可以對用戶進(jìn)行身份認(rèn)證舱禽。這種方案在單機(jī)情況下沒有問題炒刁,但是在集群環(huán)境下就必須要求session數(shù)據(jù)共享,這個(gè)問題我們在spt的開發(fā)開始就遇到過誊稚,我們處理方案是通過將session存儲(chǔ)到redis中翔始,然后改變tomcat服務(wù)器的session讀取邏輯贡耽,該方案對于Tomcat的版本有要求刀森,同時(shí)需要對每一臺(tái)tomcat進(jìn)行處理繁涂,由于session持久化到redis中所以也存在session丟失的可能揪利。而jwt是將用戶信息完全以加密的形式返回給客戶端镊叁,客戶端每次發(fā)送請求時(shí)都將該信息發(fā)送到服務(wù)器進(jìn)行身份驗(yàn)證俺祠,也就是服務(wù)器端不再保存session信息潘懊,即服務(wù)的無狀態(tài)线婚。
原理
JWT 的原理是狼电,服務(wù)器認(rèn)證以后蜒灰,生成一個(gè) JSON 對象弦蹂,發(fā)回給用戶,格式如下:{ "username": "cys", "權(quán)限": "/api/user", "expire": "2018-10-28 00:00:00" } 强窖,用戶與服務(wù)端通信的時(shí)候凸椿,都要發(fā)回這個(gè) JSON 對象。服務(wù)器完全只靠這個(gè)對象認(rèn)定用戶身份翅溺。為了防止用戶篡改數(shù)據(jù)脑漫,服務(wù)器在生成這個(gè)對象的時(shí)候,會(huì)加上簽名咙崎。 服務(wù)器就不保存任何 session 數(shù)據(jù)了窿撬,也就是說,服務(wù)器變成無狀態(tài)了叙凡,從而比較容易實(shí)現(xiàn)擴(kuò)展劈伴。
使用方式
客戶端收到服務(wù)器返回的 JWT,可以儲(chǔ)存在 cookie 里面握爷,也可以儲(chǔ)存在 localStorage跛璧。 此后,客戶端每次與服務(wù)器通信新啼,都要帶上這個(gè) JWT追城。你可以把它放在 Cookie 里面自動(dòng)發(fā)送,但是這樣不能跨域燥撞,所以更好的做法是放在 HTTP 請求的頭信息Authorization字段里面座柱。 Authorization: Bearer 另一種做法是,跨域的時(shí)候物舒,JWT 就放在 POST 請求的數(shù)據(jù)體里面色洞。
后臺(tái)集成
目前后臺(tái)用的spring boot,所以主要就是介紹spring boot如何集成jwt
1冠胯、pom文件中添加maven依賴如下:
2火诸、security中不對登錄及其他請求進(jìn)行攔截,配置如下:
3荠察、登錄時(shí)操作如下:
4置蜀、接口調(diào)用時(shí)操作如下:
主要操作有,獲取到用戶的token悉盆,通過服務(wù)器的私鑰判斷該token是否合法盯荤,然后獲取用戶的權(quán)限判斷當(dāng)前請求是否合法。