refactor(simple-jwt-jjwt): Modified the implementation of creating a Token using a Java bean.
This commit is contained in:
+24
-13
@@ -22,6 +22,7 @@ import cn.org.codecrafters.guid.GuidCreator;
|
|||||||
import cn.org.codecrafters.simplejwt.SecretCreator;
|
import cn.org.codecrafters.simplejwt.SecretCreator;
|
||||||
import cn.org.codecrafters.simplejwt.TokenPayload;
|
import cn.org.codecrafters.simplejwt.TokenPayload;
|
||||||
import cn.org.codecrafters.simplejwt.TokenResolver;
|
import cn.org.codecrafters.simplejwt.TokenResolver;
|
||||||
|
import cn.org.codecrafters.simplejwt.annotations.ExcludeFromPayload;
|
||||||
import cn.org.codecrafters.simplejwt.constants.TokenAlgorithm;
|
import cn.org.codecrafters.simplejwt.constants.TokenAlgorithm;
|
||||||
import cn.org.codecrafters.simplejwt.exceptions.WeakSecretException;
|
import cn.org.codecrafters.simplejwt.exceptions.WeakSecretException;
|
||||||
import cn.org.codecrafters.simplejwt.jjwt.config.JjwtTokenResolverConfig;
|
import cn.org.codecrafters.simplejwt.jjwt.config.JjwtTokenResolverConfig;
|
||||||
@@ -38,10 +39,7 @@ import java.security.Key;
|
|||||||
import java.time.Duration;
|
import java.time.Duration;
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
import java.time.ZoneId;
|
import java.time.ZoneId;
|
||||||
import java.util.Date;
|
import java.util.*;
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Objects;
|
|
||||||
import java.util.UUID;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The {@link JjwtTokenResolver} class is an implementation of the {@link
|
* The {@link JjwtTokenResolver} class is an implementation of the {@link
|
||||||
@@ -175,7 +173,8 @@ public class JjwtTokenResolver implements TokenResolver<Jws<Claims>> {
|
|||||||
this.key = Keys.hmacShaKeyFor(SecretCreator.createSecret(32, true, true, true).getBytes(StandardCharsets.UTF_8));
|
this.key = Keys.hmacShaKeyFor(SecretCreator.createSecret(32, true, true, true).getBytes(StandardCharsets.UTF_8));
|
||||||
}
|
}
|
||||||
|
|
||||||
private String buildToken(Duration expireAfter, String audience, String subject, LocalDateTime now, Map<String, Object> claims) {
|
private String buildToken(Duration expireAfter, String audience, String subject, Map<String, Object> claims) {
|
||||||
|
var now = LocalDateTime.now();
|
||||||
var builder = Jwts.builder()
|
var builder = Jwts.builder()
|
||||||
.setHeaderParam("typ", "JWT")
|
.setHeaderParam("typ", "JWT")
|
||||||
.setIssuedAt(Date.from(now.atZone(ZoneId.systemDefault()).toInstant()))
|
.setIssuedAt(Date.from(now.atZone(ZoneId.systemDefault()).toInstant()))
|
||||||
@@ -205,7 +204,7 @@ public class JjwtTokenResolver implements TokenResolver<Jws<Claims>> {
|
|||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public String createToken(Duration expireAfter, String audience, String subject) {
|
public String createToken(Duration expireAfter, String audience, String subject) {
|
||||||
return buildToken(expireAfter, audience, subject, LocalDateTime.now(), null);
|
return buildToken(expireAfter, audience, subject, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -220,7 +219,7 @@ public class JjwtTokenResolver implements TokenResolver<Jws<Claims>> {
|
|||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public String createToken(Duration expireAfter, String audience, String subject, Map<String, Object> payload) {
|
public String createToken(Duration expireAfter, String audience, String subject, Map<String, Object> payload) {
|
||||||
return buildToken(expireAfter, audience, subject, LocalDateTime.now(), payload);
|
return buildToken(expireAfter, audience, subject, payload);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -238,14 +237,26 @@ public class JjwtTokenResolver implements TokenResolver<Jws<Claims>> {
|
|||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public <T extends TokenPayload> String createToken(Duration expireAfter, String audience, String subject, T payload) {
|
public <T extends TokenPayload> String createToken(Duration expireAfter, String audience, String subject, T payload) {
|
||||||
try {
|
var fields = payload.getClass().getDeclaredFields();
|
||||||
var claims = MapUtil.objectToMap(payload);
|
var payloadMap = new HashMap<String, Object>();
|
||||||
return buildToken(expireAfter, audience, subject, LocalDateTime.now(), claims);
|
|
||||||
} catch (IllegalAccessException e) {
|
for (var field : fields) {
|
||||||
log.error("An error occurs while accessing the fields of the object");
|
if (field.isAnnotationPresent(ExcludeFromPayload.class))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
try {
|
||||||
|
field.setAccessible(true);
|
||||||
|
// Build Claims
|
||||||
|
/*
|
||||||
|
* Note (17 Oct, 2023): The jjwt can only add a map to be added.
|
||||||
|
*/
|
||||||
|
payloadMap.put(field.getName(), field.get(payload));
|
||||||
|
} catch (IllegalAccessException e) {
|
||||||
|
log.error("Cannot access field {}!", field.getName());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return null;
|
return buildToken(expireAfter, audience, subject, payloadMap);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
Reference in New Issue
Block a user