首頁 > 軟體

java使用JWT的方法

2022-06-06 18:00:24

一、簡介

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內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com