天天看點

JWT整合springboot實作token認證(代碼實踐)

    JWT的介紹和優缺點在此就不做說明了,相信這些網上的介紹比這裡三言兩語更加清楚,本文用于單點登入的,提高使用者體驗。

  • 生成token,傳回給前端,前端可儲存于cookie中,後面調用api接口時發送給後端
public static final long EXPIRATION_TIME = 3600_000; // 1 hour
public static final String SECRET = "secret";
public static final String TOKEN_PREFIX = "Bearer";
public static final String HEADER_STRING = "Authorization";
public static final String ROLE = "ROLE";

public static String getToken(String userRole) {
    HashMap<String, Object> map = new HashMap<>();
    map.put(ROLE, userRole);

    String jwt = Jwts.builder()
            .setClaims(map)  //playload部分
            .setSubject("主題")   // 主題
            .setIssuer("jay")     // 簽發者
            .setIssuedAt(new Date()) // 簽發時間
            .setExpiration(new Date(System.currentTimeMillis() + EXPIRATION_TIME)) //過期時間
            .signWith(SignatureAlgorithm.HS512, SECRET) //簽名
            .compact();
    return TOKEN_PREFIX + " " + jwt;
}
           
  •  解析token,取出playload部分的資料,以作對比
public static HttpServletRequest validateTokenAndAddUserIdToHeader(HttpServletRequest request) {
    String token = request.getHeader(HEADER_STRING);
    if (token != null) {
        // parse the token.
        try {
            Map<String, Object> body = Jwts.parser()
                    .setSigningKey(SECRET)
                    .parseClaimsJws(token.replace(TOKEN_PREFIX, ""))
                    .getBody();
            return new CustomHttpServletRequest(request, body);
        } catch (Exception e) {
            logger.info(e.getMessage());
            throw new TokenValidationException(e.getMessage());
        }
    } else {
        throw new TokenValidationException("Missing token");
    }
}
           
  •  解析部分一般在攔截器中處理,過期逾時則傳回登入頁,token的過期時間也可使用以舊換新的方式,如App,每次打開App的時候重新整理token的過期時間,這樣就可以避免使用者重複登入了。

類似文章推薦:https://www.jianshu.com/p/fe67b4bb6f2c

GitHub推薦:https://github.com/ZhongjunTian/spring-boot-jwt-demo/basic

繼續閱讀