1. 程式人生 > 其它 >SpringBoot整合JWT

SpringBoot整合JWT

技術標籤:jwt

JWT

什麼是token

按照一定規則生成的字串,其中包含使用者資訊

什麼是JwtJson web token

token的一種規則

JWT格式

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-hhP3hlev-1607869806973)(C:\Users\acer\AppData\Roaming\Typora\typora-user-images\image-20201213160817402.png)]

  • 紅色部分::第一部分::Base64URL演算法

    • jwt頭資訊
    {
      "alg": "HS256",
      "typ": "JWT"
    }
    
  • 紫色部分::第二部分::Base64URL演算法

    • 有效載荷(包含主體資訊)
 { 
  "iss": "Online JWT Builder"
, //簽發者 "iat": 1416797419, //簽發時間 "exp": 1448333419, //過期時間 "aud": "www.example.com", //接收方 "sub": "[email protected]", //面向的使用者 }
  • 藍色部分::第三部分

    • 簽名雜湊(防偽標誌)
    HMACSHA256(
      base64UrlEncode(header) + "." +
      base64UrlEncode
    (payload), secret)

專案使用

引入依賴

 <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt</artifactId>
        </dependency>

JWT工具類

package com.atguigu.commonutils;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jws;
import io.
jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; import org.springframework.http.server.reactive.ServerHttpRequest; import org.springframework.util.StringUtils; import javax.servlet.http.HttpServletRequest; import java.util.Date; /** * @author helen * @since 2019/10/16 */ public class JwtUtils { //設定token過期時間 public static final long EXPIRE = 1000 * 60 * 60 * 24; //金鑰:自定義 public static final String APP_SECRET = "ukc8BDbRigUDaY6pZFfWus2jZWLPHO"; /** * 生成token字串 * * id:自定義設定傳入的id值 * nickname:自定義設定傳入的nickeName值 */ public static String getJwtToken(String id, String nickname){ //構建jwt字串 String JwtToken = Jwts.builder() //設定jwt頭資訊 .setHeaderParam("typ", "JWT") .setHeaderParam("alg", "HS256") //面向的物件 .setSubject("guli-user") //簽發時間 .setIssuedAt(new Date()) //設定過期時間 .setExpiration(new Date(System.currentTimeMillis() + EXPIRE)) //自定義設定token主體部分(key:value形式),儲存使用者資訊 .claim("id", id) .claim("nickname", nickname) //簽名hash,根據HS256方式+自定義金鑰 .signWith(SignatureAlgorithm.HS256, APP_SECRET) //生成JWT .compact(); return JwtToken; } /** * 判斷token是否存在與有效 */ public static boolean checkToken(String jwtToken) { if(StringUtils.isEmpty(jwtToken)) return false; try { //根據自定義金鑰進行解析傳來的token資訊 Jwts.parser().setSigningKey(APP_SECRET).parseClaimsJws(jwtToken); } catch (Exception e) { e.printStackTrace(); return false; } return true; } /** * 判斷token是否存在與有效 */ public static boolean checkToken(HttpServletRequest request) { try { //將token資訊放在請求頭裡面進行解析 String jwtToken = request.getHeader("token"); if(StringUtils.isEmpty(jwtToken)) return false; Jwts.parser().setSigningKey(APP_SECRET).parseClaimsJws(jwtToken); } catch (Exception e) { e.printStackTrace(); return false; } return true; } /** * 根據token獲取會員id */ public static String getMemberIdByJwtToken(HttpServletRequest request) { String jwtToken = request.getHeader("token"); if(StringUtils.isEmpty(jwtToken)) return ""; Jws<Claims> claimsJws = Jwts.parser().setSigningKey(APP_SECRET).parseClaimsJws(jwtToken); //獲取jwt的主體部分 Claims claims = claimsJws.getBody(); return (String)claims.get("id"); } }