Skip to content

Commit 20f1471

Browse files
committed
refactor(simple-jwt-jjwt): Modified the implementation of creating a Token using a Java bean.
1 parent de98473 commit 20f1471

File tree

1 file changed

+24
-13
lines changed

1 file changed

+24
-13
lines changed

simple-jwt-jjwt/src/main/java/cn/org/codecrafters/simplejwt/jjwt/JjwtTokenResolver.java

Lines changed: 24 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import cn.org.codecrafters.simplejwt.SecretCreator;
2323
import cn.org.codecrafters.simplejwt.TokenPayload;
2424
import cn.org.codecrafters.simplejwt.TokenResolver;
25+
import cn.org.codecrafters.simplejwt.annotations.ExcludeFromPayload;
2526
import cn.org.codecrafters.simplejwt.constants.TokenAlgorithm;
2627
import cn.org.codecrafters.simplejwt.exceptions.WeakSecretException;
2728
import cn.org.codecrafters.simplejwt.jjwt.config.JjwtTokenResolverConfig;
@@ -38,10 +39,7 @@
3839
import java.time.Duration;
3940
import java.time.LocalDateTime;
4041
import java.time.ZoneId;
41-
import java.util.Date;
42-
import java.util.Map;
43-
import java.util.Objects;
44-
import java.util.UUID;
42+
import java.util.*;
4543

4644
/**
4745
* The {@link JjwtTokenResolver} class is an implementation of the {@link
@@ -175,7 +173,8 @@ public JjwtTokenResolver(String issuer) {
175173
this.key = Keys.hmacShaKeyFor(SecretCreator.createSecret(32, true, true, true).getBytes(StandardCharsets.UTF_8));
176174
}
177175

178-
private String buildToken(Duration expireAfter, String audience, String subject, LocalDateTime now, Map<String, Object> claims) {
176+
private String buildToken(Duration expireAfter, String audience, String subject, Map<String, Object> claims) {
177+
var now = LocalDateTime.now();
179178
var builder = Jwts.builder()
180179
.setHeaderParam("typ", "JWT")
181180
.setIssuedAt(Date.from(now.atZone(ZoneId.systemDefault()).toInstant()))
@@ -205,7 +204,7 @@ private String buildToken(Duration expireAfter, String audience, String subject,
205204
*/
206205
@Override
207206
public String createToken(Duration expireAfter, String audience, String subject) {
208-
return buildToken(expireAfter, audience, subject, LocalDateTime.now(), null);
207+
return buildToken(expireAfter, audience, subject, null);
209208
}
210209

211210
/**
@@ -220,7 +219,7 @@ public String createToken(Duration expireAfter, String audience, String subject)
220219
*/
221220
@Override
222221
public String createToken(Duration expireAfter, String audience, String subject, Map<String, Object> payload) {
223-
return buildToken(expireAfter, audience, subject, LocalDateTime.now(), payload);
222+
return buildToken(expireAfter, audience, subject, payload);
224223
}
225224

226225
/**
@@ -238,14 +237,26 @@ public String createToken(Duration expireAfter, String audience, String subject,
238237
*/
239238
@Override
240239
public <T extends TokenPayload> String createToken(Duration expireAfter, String audience, String subject, T payload) {
241-
try {
242-
var claims = MapUtil.objectToMap(payload);
243-
return buildToken(expireAfter, audience, subject, LocalDateTime.now(), claims);
244-
} catch (IllegalAccessException e) {
245-
log.error("An error occurs while accessing the fields of the object");
240+
var fields = payload.getClass().getDeclaredFields();
241+
var payloadMap = new HashMap<String, Object>();
242+
243+
for (var field : fields) {
244+
if (field.isAnnotationPresent(ExcludeFromPayload.class))
245+
continue;
246+
247+
try {
248+
field.setAccessible(true);
249+
// Build Claims
250+
/*
251+
* Note (17 Oct, 2023): The jjwt can only add a map to be added.
252+
*/
253+
payloadMap.put(field.getName(), field.get(payload));
254+
} catch (IllegalAccessException e) {
255+
log.error("Cannot access field {}!", field.getName());
256+
}
246257
}
247258

248-
return null;
259+
return buildToken(expireAfter, audience, subject, payloadMap);
249260
}
250261

251262
/**

0 commit comments

Comments
 (0)