From fd281ff99ecda2084c817bb8914c9c7911202495 Mon Sep 17 00:00:00 2001 From: Zihlu Wang Date: Tue, 17 Oct 2023 14:15:32 +0800 Subject: [PATCH] feat(simple-jwt-jjwt): Added the feature to generate a new Token using data from the original Token. --- .../simplejwt/jjwt/JjwtTokenResolver.java | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/simple-jwt-jjwt/src/main/java/cn/org/codecrafters/simplejwt/jjwt/JjwtTokenResolver.java b/simple-jwt-jjwt/src/main/java/cn/org/codecrafters/simplejwt/jjwt/JjwtTokenResolver.java index 5d8db00..09e96bd 100644 --- a/simple-jwt-jjwt/src/main/java/cn/org/codecrafters/simplejwt/jjwt/JjwtTokenResolver.java +++ b/simple-jwt-jjwt/src/main/java/cn/org/codecrafters/simplejwt/jjwt/JjwtTokenResolver.java @@ -23,9 +23,11 @@ import cn.org.codecrafters.simplejwt.SecretCreator; import cn.org.codecrafters.simplejwt.TokenPayload; import cn.org.codecrafters.simplejwt.TokenResolver; import cn.org.codecrafters.simplejwt.annotations.ExcludeFromPayload; +import cn.org.codecrafters.simplejwt.constants.PredefinedKeys; import cn.org.codecrafters.simplejwt.constants.TokenAlgorithm; import cn.org.codecrafters.simplejwt.exceptions.WeakSecretException; import cn.org.codecrafters.simplejwt.jjwt.config.JjwtTokenResolverConfig; +import com.fasterxml.jackson.core.type.TypeReference; import io.jsonwebtoken.Claims; import io.jsonwebtoken.Jws; import io.jsonwebtoken.Jwts; @@ -303,6 +305,26 @@ public class JjwtTokenResolver implements TokenResolver> { return null; } + /** + * Re-generate a new token with the payload in the old one. + * + * @param oldToken the old token + * @param expireAfter how long the new token can be valid for + * @return re-generated token with the payload in the old one + */ + @Override + public String renew(String oldToken, Duration expireAfter) { + var resolvedToken = resolve(oldToken); + var tokenPayloads = resolvedToken.getBody(); + + var audience = tokenPayloads.getAudience(); + var subject = tokenPayloads.getSubject(); + + PredefinedKeys.KEYS.forEach(tokenPayloads::remove); + + return createToken(expireAfter, audience, subject, tokenPayloads); + } + /** * Renews the given expired token with the specified custom payload data. *