This commit is contained in:
Looly 2025-10-22 00:41:33 +08:00
parent d4790d29e0
commit 49818978b2
4 changed files with 32 additions and 25 deletions

View File

@ -136,7 +136,7 @@ public class JWT implements RegisteredPayload<JWT> {
* @return this
*/
public JWT setKey(final byte[] key) {
return setSigner(getAlgorithm(), key);
return setSigner(StrUtil.defaultIfNull(getAlgorithm(), "HS256"), key);
}
/**
@ -182,6 +182,13 @@ public class JWT implements RegisteredPayload<JWT> {
*/
public JWT setSigner(final JWTSigner signer) {
this.signer = signer;
// 检查头信息中是否有算法信息
final String algorithm = (String) this.header.getClaim(JWTHeader.ALGORITHM);
if (StrUtil.isBlank(algorithm)) {
this.header.setAlgorithm(AlgorithmUtil.getId(signer.getAlgorithm()));
}
return this;
}

View File

@ -34,7 +34,7 @@ public class JWTUtil {
* @return JWT Token
*/
public static String createToken(final Map<String, ?> payload, final byte[] key) {
return createToken(MapUtil.of(JWTHeader.TYPE, "JWT"), payload, key);
return createToken(MapUtil.ofKvs(false,JWTHeader.TYPE, "JWT", JWTHeader.ALGORITHM, "HS256"), payload, key);
}
/**

View File

@ -44,7 +44,7 @@ public class IssueI6IS5BTest {
final JSONObject payloadsData = JSONUtil.parseObj(jwtToken, JSONConfig.of().setDateFormat(DateFormatManager.FORMAT_SECONDS));
final String token = JWTUtil.createToken(payloadsData, "123".getBytes(StandardCharsets.UTF_8));
Assertions.assertEquals("eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpYXQiOjE2Nzc3NzI4MDB9.SXU_mm1wT5lNoK-Dq5Y8f3BItv_44zuAlyeWLqajpXg", token);
Assertions.assertEquals("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE2Nzc3NzI4MDB9.W88PB2ovAqCXV4QdbeKbdFW-P057xOTXEosD8hbOa9U", token);
final JSONObject payloads = JWTUtil.parseToken(token).getPayloads();
Assertions.assertEquals("{\"iat\":1677772800}", payloads.toString());
final JwtToken o = payloads.toBean(JwtToken.class);
@ -65,7 +65,7 @@ public class IssueI6IS5BTest {
final JSONObject payloadsData = JSONUtil.parseObj(jwtToken, JSONConfig.of().setDateFormat(DateFormatManager.FORMAT_SECONDS));
final String token = JWTUtil.createToken(payloadsData, "123".getBytes(StandardCharsets.UTF_8));
Assertions.assertEquals("eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpYXQiOjE2Nzc3NzI4MDB9.SXU_mm1wT5lNoK-Dq5Y8f3BItv_44zuAlyeWLqajpXg", token);
Assertions.assertEquals("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE2Nzc3NzI4MDB9.W88PB2ovAqCXV4QdbeKbdFW-P057xOTXEosD8hbOa9U", token);
final JSONObject payloads = JWTUtil.parseToken(token).getPayloads();
Assertions.assertEquals("{\"iat\":1677772800}", payloads.toString());
final JwtToken2 o = payloads.toBean(JwtToken2.class);

View File

@ -27,16 +27,16 @@ import java.util.Date;
public class JWTValidatorTest {
@Test
public void expiredAtTest(){
Assertions.assertThrows(ValidateException.class, ()->{
public void expiredAtTest() {
Assertions.assertThrows(ValidateException.class, () -> {
final String token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE0Nzc1OTJ9.isvT0Pqx0yjnZk53mUFSeYFJLDs-Ls9IsNAm86gIdZo";
JWTValidator.of(token).validateDate(DateUtil.now());
});
}
@Test
public void issueAtTest(){
Assertions.assertThrows(ValidateException.class, ()->{
public void issueAtTest() {
Assertions.assertThrows(ValidateException.class, () -> {
final String token = JWT.of()
.setIssuedAt(DateUtil.now())
.setKey("123456".getBytes())
@ -48,19 +48,19 @@ public class JWTValidatorTest {
}
@Test
public void issueAtPassTest(){
public void issueAtPassTest() {
final String token = JWT.of()
.setIssuedAt(DateUtil.now())
.setKey("123456".getBytes())
.sign();
.setIssuedAt(DateUtil.now())
.setKey("123456".getBytes())
.sign();
// 签发时间早于被检查的时间
JWTValidator.of(token).validateDate(DateUtil.now());
}
@Test
public void notBeforeTest(){
Assertions.assertThrows(ValidateException.class, ()->{
public void notBeforeTest() {
Assertions.assertThrows(ValidateException.class, () -> {
final JWT jwt = JWT.of()
.setNotBefore(DateUtil.now());
@ -69,25 +69,25 @@ public class JWTValidatorTest {
}
@Test
public void notBeforePassTest(){
public void notBeforePassTest() {
final JWT jwt = JWT.of()
.setNotBefore(DateUtil.now());
.setNotBefore(DateUtil.now());
JWTValidator.of(jwt).validateDate(DateUtil.now());
}
@Test
public void validateAlgorithmTest(){
public void validateAlgorithmTest() {
final String token = JWT.of()
.setNotBefore(DateUtil.now())
.setKey("123456".getBytes())
.sign();
.setNotBefore(DateUtil.now())
.setKey("123456".getBytes())
.sign();
// 验证算法
JWTValidator.of(token).validateAlgorithm(JWTSignerUtil.hs256("123456".getBytes()));
}
@Test
public void validateTest(){
public void validateTest() {
final String token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJNb0xpIiwiZXhwIjoxNjI0OTU4MDk0NTI4LCJpYXQiOjE2MjQ5NTgwMzQ1MjAsInVzZXIiOiJ1c2VyIn0.L0uB38p9sZrivbmP0VlDe--j_11YUXTu3TfHhfQhRKc";
final byte[] key = "1234567890".getBytes();
final boolean validate = JWT.of(token).setKey(key).validate(0);
@ -95,8 +95,8 @@ public class JWTValidatorTest {
}
@Test
public void validateDateTest(){
Assertions.assertThrows(ValidateException.class, ()->{
public void validateDateTest() {
Assertions.assertThrows(ValidateException.class, () -> {
final JWT jwt = JWT.of()
.setPayload("id", 123)
.setPayload("username", "hutool")
@ -107,7 +107,7 @@ public class JWTValidatorTest {
}
@Test
public void issue2329Test(){
public void issue2329Test() {
final long now = System.currentTimeMillis();
final Date nowTime = new Date(now);
final long expired = 3 * 1000L;
@ -115,7 +115,7 @@ public class JWTValidatorTest {
// 使用这种方式生成token
final String token = JWT.of().setPayload("sub", "blue-light").setIssuedAt(nowTime).setNotBefore(expiredTime)
.setExpiresAt(expiredTime).setKey("123456".getBytes()).sign();
.setExpiresAt(expiredTime).setKey("123456".getBytes()).sign();
// 使用这种方式验证token
JWTValidator.of(JWT.of(token)).validateDate(DateUtil.date(now - 4000), 10);