java使用JWT的方法
一、簡介
JWT是token的一種,一個JWT字符串包含三個部分
1.Header
頭部信息,一般不需要聲明,默認為 HS256 簽名算法和 JWT 令牌類型
{ "alg": "HS256", // 指定簽名算法 "typ": "JWT" // 指定token令牌類型 }
2.Payload
包含一些默認字段,還可以自定義一些私有字段,但是不要放敏感信息
iss: 發行人
exp: 到期時間
sub: 主題
aud: 用戶
nbf: 在此之前不可用
iat: 發佈時間
jti: JWT ID用於標識該JWT
3.Signature
數據簽名,對上面兩部分進行數據簽名,Header部分和Payload部分先進行base64Url編碼,然後用英文句號拼接並加上一個自定義的secret字符串鹽值進行HS256對稱加密【也可以用其它算法或非對稱加密】
iss: 發行人 exp: 到期時間 sub: 主題 aud: 用戶 nbf: 在此之前不可用 iat: 發佈時間 jti: JWT ID用於標識該JWT
4.組合
最後將 Header、Payload、Signature三部分用英文句號拼接就生成瞭完整的JWT
Header.Payload.Signature
二、封裝類
1.引入依賴
<!-- jwt --> <dependency> <groupId>com.auth0</groupId> <artifactId>java-jwt</artifactId> <version>3.10.3</version> </dependency>
2.封裝方法
package com.cxstar.utils; import com.auth0.jwt.JWT; import com.auth0.jwt.JWTCreator; import com.auth0.jwt.algorithms.Algorithm; import com.auth0.jwt.interfaces.DecodedJWT; import com.auth0.jwt.interfaces.JWTVerifier; import java.util.Calendar; import java.util.Map; public class JwtUtil { // 簽名密鑰 private static final String SECRET = "hello JWT *%$#$&"; /** * 生成token * @param payload token攜帶的信息 * @return token字符串 */ public static String generateToken(Map<String,String> payload){ // 指定token過期時間 Calendar calendar = Calendar.getInstance(); calendar.add(Calendar.HOUR, 24); // 24小時 JWTCreator.Builder builder = JWT.create(); // 構建payload payload.forEach(builder::withClaim); // 指定過期時間和簽名算法,並返回token String token = builder.withExpiresAt(calendar.getTime()).sign(Algorithm.HMAC256(SECRET)); return token; } /** * 解析token * @param token token字符串 * @return 解析後的token類 */ public static DecodedJWT decodeToken(String token){ JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256(SECRET)).build(); DecodedJWT decodedJWT = jwtVerifier.verify(token); return decodedJWT; } }
三、使用方法
package com.cxstar; import com.auth0.jwt.exceptions.JWTDecodeException; import com.auth0.jwt.exceptions.TokenExpiredException; import com.auth0.jwt.interfaces.DecodedJWT; import com.cxstar.utils.JwtUtil; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; import java.util.HashMap; import java.util.Map; @SpringBootTest class JwtLoginApplicationTests { @Test void tokenTest() { // 根據用戶信息生成令牌 -------------------------- Map<String, String> payload = new HashMap<>(); payload.put("userId", "233"); payload.put("userName", "ps"); String token = JwtUtil.generateToken(payload); System.out.println("token: " + token); // -------------------------------------------- // 解析令牌並獲取用戶信息 ------------------------------------------------ try { DecodedJWT decodedJWT = JwtUtil.decodeToken(token); String userId = decodedJWT.getClaim("userId").asString(); String userName = decodedJWT.getClaim("userName").asString(); String exp = decodedJWT.getExpiresAt().toString(); System.out.println("userId: " + userId); // 取出自定義屬性【用戶id】 System.out.println("userName: " + userName); // 取出自定義屬性【用戶名】 System.out.println("exp: " + exp); // 取出默認屬性【過期時間】 } catch (JWTDecodeException e) { System.out.println("令牌錯誤"); } catch (TokenExpiredException e) { System.out.println("令牌過期"); } // ------------------------------------------------------------------- } }
ps:最後附一篇寫的很詳細的JWT文章https://www.jb51.net/article/250529.htm
到此這篇關於java使用JWT的文章就介紹到這瞭,更多相關java使用JWT內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Java Jwt庫的簡介及使用詳解
- 一文掌握Java中的JWT
- Java JWT實現跨域身份驗證方法詳解
- SpringBoot集成JWT實現登陸驗證的方法詳解
- SpringBoot整合JWT Token的完整步驟