From 191339d91ad034c7c6da5c17e3ac663643018816 Mon Sep 17 00:00:00 2001 From: Looly Date: Sat, 14 Sep 2024 16:17:16 +0800 Subject: [PATCH] fix code --- .../java/org/dromara/hutool/json/jwt/JWT.java | 26 ++++++++++++++++--- .../hutool/json/jwt/Issue3732Test.java | 24 +++++++++++++++++ .../org/dromara/hutool/json/jwt/JWTTest.java | 2 +- 3 files changed, 48 insertions(+), 4 deletions(-) create mode 100644 hutool-json/src/test/java/org/dromara/hutool/json/jwt/Issue3732Test.java diff --git a/hutool-json/src/main/java/org/dromara/hutool/json/jwt/JWT.java b/hutool-json/src/main/java/org/dromara/hutool/json/jwt/JWT.java index 94e0ce398..116807026 100644 --- a/hutool-json/src/main/java/org/dromara/hutool/json/jwt/JWT.java +++ b/hutool-json/src/main/java/org/dromara/hutool/json/jwt/JWT.java @@ -333,7 +333,18 @@ public class JWT implements RegisteredPayload { * @return JWT字符串 */ public String sign() { - return sign(this.signer); + return sign(true); + } + + /** + * 签名生成JWT字符串 + * + * @param addTypeIfNot 如果'typ'头不存在,是否赋值默认值 + * @return JWT字符串 + * @since 5.8.24 + */ + public String sign(final boolean addTypeIfNot) { + return sign(this.signer, addTypeIfNot); } /** @@ -348,12 +359,21 @@ public class JWT implements RegisteredPayload { *
  • 当用户未定义"alg"时,根据传入的{@link JWTSigner}对象类型,赋值对应ID
  • * * - * @param signer 自定义JWT签名器,非空 + * @param signer 自定义JWT签名器,非空 + * @param addTypeIfNot 如果'typ'头不存在,是否赋值默认值 * @return JWT字符串 */ - public String sign(final JWTSigner signer) { + public String sign(final JWTSigner signer, final boolean addTypeIfNot) { Assert.notNull(signer, () -> new JWTException("No Signer provided!")); + // 检查tye信息 + if (addTypeIfNot) { + final String type = (String) this.header.getClaim(JWTHeader.TYPE); + if (StrUtil.isBlank(type)) { + this.header.setClaim(JWTHeader.TYPE, "JWT"); + } + } + // 检查头信息中是否有算法信息 final String algorithm = (String) this.header.getClaim(JWTHeader.ALGORITHM); if (StrUtil.isBlank(algorithm)) { diff --git a/hutool-json/src/test/java/org/dromara/hutool/json/jwt/Issue3732Test.java b/hutool-json/src/test/java/org/dromara/hutool/json/jwt/Issue3732Test.java new file mode 100644 index 000000000..ea0c0efe4 --- /dev/null +++ b/hutool-json/src/test/java/org/dromara/hutool/json/jwt/Issue3732Test.java @@ -0,0 +1,24 @@ +package org.dromara.hutool.json.jwt; + +import org.dromara.hutool.json.jwt.signers.JWTSigner; +import org.dromara.hutool.json.jwt.signers.JWTSignerUtil; +import org.junit.jupiter.api.Test; + +import java.util.HashMap; +import java.util.Map; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class Issue3732Test { + @Test + void hmacTest() { + final JWTSigner SIGNER = JWTSignerUtil.hs256("6sf2f5j2a62a3s8f9032hsf".getBytes()); + final Map payload = new HashMap<>(); + payload.put("name", "test"); + payload.put("role", "admin"); + + // 创建 JWT token + final String token = JWTUtil.createToken(payload, SIGNER); + assertEquals("eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyb2xlIjoiYWRtaW4iLCJuYW1lIjoidGVzdCJ9.pD3Xz41rtXvU3G1c_yS7ir01FXmDvtjjAOU2HYd8MdA", token); + } +} diff --git a/hutool-json/src/test/java/org/dromara/hutool/json/jwt/JWTTest.java b/hutool-json/src/test/java/org/dromara/hutool/json/jwt/JWTTest.java index 93251f181..0b2d9733e 100644 --- a/hutool-json/src/test/java/org/dromara/hutool/json/jwt/JWTTest.java +++ b/hutool-json/src/test/java/org/dromara/hutool/json/jwt/JWTTest.java @@ -185,7 +185,7 @@ public class JWTTest { final Map map = new HashMap<>(); map.put("test2", 22222222222222L); final JWTSigner jwtSigner = JWTSignerUtil.createSigner(AlgorithmUtil.getAlgorithm("HS256"), Base64.getDecoder().decode("abcdefghijklmn")); - final String sign = JWT.of().addPayloads(map).sign(jwtSigner); + final String sign = JWT.of().addPayloads(map).sign(jwtSigner, true); final Object test2 = JWT.of(sign).getPayload().getClaim("test2"); Assertions.assertEquals(Long.class, test2.getClass()); }