2222import cn .org .codecrafters .simplejwt .SecretCreator ;
2323import cn .org .codecrafters .simplejwt .TokenPayload ;
2424import cn .org .codecrafters .simplejwt .TokenResolver ;
25+ import cn .org .codecrafters .simplejwt .annotations .ExcludeFromPayload ;
2526import cn .org .codecrafters .simplejwt .constants .TokenAlgorithm ;
2627import cn .org .codecrafters .simplejwt .exceptions .WeakSecretException ;
2728import cn .org .codecrafters .simplejwt .jjwt .config .JjwtTokenResolverConfig ;
3839import java .time .Duration ;
3940import java .time .LocalDateTime ;
4041import 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