基於SpringBoot的 JSON Web Token(JWT)Token認證機制實現

Token Auth的優點

  1. JSON Web Token(JWT)是一個非常輕巧的規範。這個規範允許我們使用JWT在用戶和服務器之間傳遞安全可靠的信息。
  2. 支持跨域訪問: Cookie是不允許垮域訪問的,這一點對Token機制是不存在的,前提是傳輸的用戶認證信息通過HTTP頭傳輸.
  3. 無狀態(也稱:服務端可擴展行):Token機制在服務端不需要存儲session信息,因爲Token 自身包含了所有登錄用戶的信息,只需要在客戶端的cookie或本地介質存儲狀態信息.
  4. 去耦: 不需要綁定到一個特定的身份驗證方案。Token可以在任何地方生成,只要在你的API被調用的時候,你可以進行Token生成調用即可.
  5. CSRF:因爲不再依賴於Cookie,所以你就不需要考慮對CSRF(跨站請求僞造)的防範。
  6. 不需要爲登錄頁面做特殊處理: 如果你使用Protractor 做功能測試的時候,不再需要爲登錄頁面做特殊處理.
  7. 基於標準化:你的API可以採用標準化的 JSON Web Token (JWT). 這個標準已經存在多個後端庫(.NET, Ruby, Java,Python, PHP)
    更適用CDN: 可以通過內容分發網絡請求你服務端的所有資料(如:javascript,HTML,圖片等),而你的服務端只要提供API即可.
  8. 移動應用: 當你的客戶端是一個原生平臺(iOS, Android,Windows 8等)時,Cookie是不被支持的(你需要通過Cookie容器進行處理),這時採用Token認證機制更合適。

JWT 基本規格。

JWT實際上就是一個字符串,它由三部分組成,頭部、載荷與簽名組成。
其實際的載荷(載荷(Payload))

jwt格式:jwtHeader.jwtPayLoad.Signature
頭部(header). 載荷(payload). 簽證(signature)

將對象編碼得到:Header 頭信息

	# 頭裏面放加密算法 及簽名信息
	{
    "type": "JWT",
    "alg": "BASE64"
	}

編碼字符串:
eyJ0eXBlIjoiSldUIiwiYWxnIjoiQkFTRTY0In0=


Map<String,String> header = new HashMap<String, String>();
        header.put("type","JWT");
        header.put("alg","BASE64");
        String jsonString = JSON.toJSONString(header);
        System.out.println(jsonString);

        BASE64Encoder base64Encoder = new BASE64Encoder();
        String encode = base64Encoder.encode(jsonString.getBytes("UTF-8"));
        System.out.println(encode);

        BASE64Decoder base64Decoder =  new BASE64Decoder();
        byte[] bytes = base64Decoder.decodeBuffer(encode);
        System.out.println(new String(bytes,"UTF-8" ));

在這裏插入圖片描述


jwtPayLoad:

{ 
  "iss": "springboot", #該JWT 的簽發者,可填/不填
  "iat": d, # 簽發時間 可填/不填
  "exp": 5s, # token 過期時間。uninx 時間戳 可填/不填
  "aud": "www.baidu.com", # 接受 jwt方 可填/不填
  "sub": "www.baidu.com" # 面向的用戶 可填/不填
}

加密解密:

Map<String,String> payLoadMap =  new HashMap<>();
        payLoadMap.put("iss","springboot");
        payLoadMap.put("iat","1234567");
        payLoadMap.put("exp","100s");
        payLoadMap.put("aud","ww.baidu.com");
        payLoadMap.put("sub","ww.baidu.com");
        String toString = JSON.toJSONString(payLoadMap);
        System.out.println(toString);
        HmacCore.HmacSHA256 hmacSHA256 = new HmacCore.HmacSHA256();

        String encode1 = base64Encoder.encode(toString.getBytes("UTF-8"));
        System.out.println(encode1);

        System.out.println(new String(base64Decoder.decodeBuffer(encode1),"UTF-8"));

利用JDK 自帶的BASE64Encoder 和 BASE64Decoder,方便的完成基於 BASE64 的編碼和解碼

eyJhdWQiOiJ3dy5iYWlkdS5jb20iLCJzdWIiOiJ3dy5iYWlkdS5jb20iLCJpc3MiOiJzcHJpbmdi
b290IiwiZXhwIjoiMTAwcyIsImlhdCI6IjEyMzQ1NjcifQ==

這個是payLoad的部分內容, jwt格式:jwtHeader.jwtPayLoad.Signature

對獲取的頭信息用(.)拼接,再用HS256 加密

eyJ0eXBlIjoiSldUIiwiYWxnIjoiQkFTRTY0In0=.eyJhdWQiOiJ3dy5iYWlkdS5jb20iLCJzdWIiOiJ3dy5iYWlkdS5jb20iLCJpc3MiOiJzcHJpbmdib290IiwiZXhwIjoiMTAwcyIsImlhdCI6IjEyMzQ1NjcifQ==

加密:

在這裏插入代碼片
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章