1. 程式人生 > >Java實現基於token認證

Java實現基於token認證

       隨著網際網路的不斷髮展,技術的迭代也非常之快。我們的使用者認證也從剛開始的使用者名稱密碼轉變到基於cookie的session認證,然而到了今天,這種認證已經不能滿足與我們的業務需求了(分散式,微服務)。我們採用了另外一種認證方式:基於token的認證。

一、與cookie相比較的優勢:

1、支援跨域訪問,將token置於請求頭中,而cookie是不支援跨域訪問的;

2、無狀態化,服務端無需儲存token,只需要驗證token資訊是否正確即可,而session需要在服務端儲存,一般是通過cookie中的sessionID在服務端查詢對應的session;

3、無需繫結到一個特殊的身份驗證方案(傳統的使用者名稱密碼登陸),只需要生成的token是符合我們預期設定的即可;

4、更適用於移動端(Android,iOS,小程式等等),像這種原生平臺不支援cookie,比如說微信小程式,每一次請求都是一次會話,當然我們可以每次去手動為他新增cookie,詳情請檢視博主另一篇部落格;

5、避免CSRF跨站偽造攻擊,還是因為不依賴cookie;

6、非常適用於RESTful API,這樣可以輕易與各種後端(java,.net,python......)相結合,去耦合

還有一些優勢這裡就不一一列舉了。

二、基於JWT的token認證實現

JWT:JSON  Web  Token,其實token就是一段字串,由三部分組成:Header,Payload,Signature。詳細情況請自行百度,現在,上程式碼。

1、引入依賴,這裡選用java-jwt,選擇其他的依賴也可以

2、實現簽名方法

設定15分鐘過期也是出於安全考慮,防止token被竊取,不過一般選擇基於token認證,傳輸方式我們都應該選擇https,這樣別人無法抓取到我們的請求資訊。這個私鑰是非常重要的,加密解密都需要用到它,要設定的足夠複雜並且不能被盜取,我這裡選用的是一串uuid,加密方式是HMAC256。

3、認證

我這裡演示的還是以傳統的使用者名稱密碼驗證,驗證通過發放token。

4、配置攔截器

實現HandleInterceptor,重寫preHandle方法,該方法是在每個請求之前觸發執行,從request的頭裡面取出token,這裡我們統一了存放token的鍵為accessToken,驗證通過,放行,驗證不通過,返回認證失敗資訊。

5、設定攔截器

這裡使用的是Spring的xml配置攔截器,放過認證介面。

6、token解碼方法

7、測試

訪問攜帶token,請求成功。

未攜帶token或者token錯誤,過期,返回認證失敗資訊。

8、獲取token裡攜帶的資訊

我們可以將一些常用的資訊放入token中,比如使用者登陸資訊,可以方便我們的使用

至此,一個簡單的基於token認證就實現了,下次我將shiro與JWT整合到一起。