From 5afc3cca8da3ca0d2537b3485a443166efa5c4de Mon Sep 17 00:00:00 2001 From: Looly Date: Tue, 13 Sep 2022 22:06:40 +0800 Subject: [PATCH] fix code --- .../src/main/java/cn/hutool/json/jwt/JWT.java | 36 ++++++++++++++----- .../java/cn/hutool/json/jwt/JWTHeader.java | 32 +++++++++++++++-- 2 files changed, 57 insertions(+), 11 deletions(-) diff --git a/hutool-json/src/main/java/cn/hutool/json/jwt/JWT.java b/hutool-json/src/main/java/cn/hutool/json/jwt/JWT.java index 9b009e977..d6a36f52c 100755 --- a/hutool-json/src/main/java/cn/hutool/json/jwt/JWT.java +++ b/hutool-json/src/main/java/cn/hutool/json/jwt/JWT.java @@ -119,6 +119,11 @@ public class JWT implements RegisteredPayload { * @return this */ public JWT setKey(final byte[] key) { + // 检查头信息中是否有算法信息 + final String algorithmId = (String) this.header.getClaim(JWTHeader.ALGORITHM); + if (StrUtil.isNotBlank(algorithmId)) { + return setSigner(algorithmId, key); + } return setSigner(JWTSignerUtil.hs256(key)); } @@ -316,19 +321,33 @@ public class JWT implements RegisteredPayload { } /** - * 签名生成JWT字符串 + * 签名生成JWT字符串,计算方式为(以HS256为例): + *
+	 * HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
+	 * 
* - * @param signer JWT签名器 + *

此方法会补充如下的header:

+ *
    + *
  • 当用户未定义"typ"时,赋默认值:"JWT"
  • + *
  • 当用户未定义"alg"时,根据传入的{@link JWTSigner}对象类型,赋值对应ID
  • + *
+ * + * @param signer 自定义JWT签名器,非空 * @return JWT字符串 */ public String sign(final JWTSigner signer) { Assert.notNull(signer, () -> new JWTException("No Signer provided!")); + // 检查tye信息 + final String type = (String) this.header.getClaim(JWTHeader.TYPE); + if (StrUtil.isBlank(type)) { + this.header.setType("JWT"); + } + // 检查头信息中是否有算法信息 - final String claim = (String) this.header.getClaim(JWTHeader.ALGORITHM); - if (StrUtil.isBlank(claim)) { - this.header.setClaim(JWTHeader.ALGORITHM, - AlgorithmUtil.getId(signer.getAlgorithm())); + final String algorithm = (String) this.header.getClaim(JWTHeader.ALGORITHM); + if (StrUtil.isBlank(algorithm)) { + this.header.setAlgorithm(AlgorithmUtil.getId(signer.getAlgorithm())); } final String headerBase64 = Base64.encodeUrlSafe(this.header.toString(), charset); @@ -378,9 +397,10 @@ public class JWT implements RegisteredPayload { } /** - * 验证JWT Token是否有效 + * 使用指定签名器,验证JWT Token是否有效
+ * 如果签名器为{@code null},或者{@link NoneJWTSigner},表示这个JWT无签名,签名部分必须为空 * - * @param signer 签名器(签名算法) + * @param signer 签名器(签名算法),如果为{@code null},默认为{@link NoneJWTSigner} * @return 是否有效 */ public boolean verify(JWTSigner signer) { diff --git a/hutool-json/src/main/java/cn/hutool/json/jwt/JWTHeader.java b/hutool-json/src/main/java/cn/hutool/json/jwt/JWTHeader.java index e27129537..64768ae48 100755 --- a/hutool-json/src/main/java/cn/hutool/json/jwt/JWTHeader.java +++ b/hutool-json/src/main/java/cn/hutool/json/jwt/JWTHeader.java @@ -30,10 +30,36 @@ public class JWTHeader extends Claims { public static String KEY_ID = "kid"; /** - * 构造,初始化默认(typ=JWT) + * 增加“alg”头信息 + * + * @param algorithm 算法ID,如HS265 + * @return this */ - public JWTHeader() { - setClaim(TYPE, "JWT"); + public JWTHeader setAlgorithm(final String algorithm) { + setClaim(ALGORITHM, algorithm); + return this; + } + + /** + * 增加“typ”头信息 + * + * @param type 类型,如JWT + * @return this + */ + public JWTHeader setType(final String type) { + setClaim(TYPE, type); + return this; + } + + /** + * 增加“cty”头信息 + * + * @param contentType 内容类型 + * @return this + */ + public JWTHeader setContentType(final String contentType) { + setClaim(CONTENT_TYPE, contentType); + return this; } /**