refactor: Optimised codes.
Move all private or protected to the last of files.
This commit is contained in:
+130
-127
@@ -104,34 +104,6 @@ import java.util.*;
|
||||
@Slf4j
|
||||
public class AuthzeroTokenResolver implements TokenResolver<DecodedJWT> {
|
||||
|
||||
/**
|
||||
* GuidCreator used for generating unique identifiers for "jti" claim in
|
||||
* JWT tokens.
|
||||
*/
|
||||
private final GuidCreator<?> jtiCreator;
|
||||
|
||||
/**
|
||||
* The algorithm used for signing and verifying JWT tokens.
|
||||
*/
|
||||
private final Algorithm algorithm;
|
||||
|
||||
/**
|
||||
* The issuer claim value to be included in JWT tokens.
|
||||
*/
|
||||
private final String issuer;
|
||||
|
||||
/**
|
||||
* The JSON Web Token resolver.
|
||||
*/
|
||||
private final JWTVerifier verifier;
|
||||
|
||||
/**
|
||||
* Jackson JSON handler.
|
||||
*/
|
||||
private final ObjectMapper objectMapper;
|
||||
|
||||
private final AuthzeroTokenResolverConfig config = AuthzeroTokenResolverConfig.getInstance();
|
||||
|
||||
/**
|
||||
* Creates a new instance of {@code AuthzeroTokenResolver} with the
|
||||
* provided configurations.
|
||||
@@ -150,7 +122,7 @@ public class AuthzeroTokenResolver implements TokenResolver<DecodedJWT> {
|
||||
throw new IllegalArgumentException("A secret is required to build a JSON Web Token.");
|
||||
}
|
||||
|
||||
if (secret.length() <= 32) {
|
||||
if (secret.length() < 32) {
|
||||
log.warn("The provided secret which owns {} characters is too weak. Please consider replacing it with a stronger one.", secret.length());
|
||||
}
|
||||
|
||||
@@ -224,104 +196,6 @@ public class AuthzeroTokenResolver implements TokenResolver<DecodedJWT> {
|
||||
log.info("The secret has been set to {}.", secret);
|
||||
}
|
||||
|
||||
/**
|
||||
* Builds the basic information of the JSON Web Token (JWT) using the
|
||||
* provided parameters and adds it to the JWTCreator.Builder.
|
||||
*
|
||||
* @param subject the subject claim value to be included in the JWT
|
||||
* @param audience an array of audience claim values to be included in
|
||||
* the JWT
|
||||
* @param expireAfter the duration after which the JWT will expire
|
||||
* @param builder the JWTCreator.Builder instance to which the basic
|
||||
* information will be added
|
||||
*/
|
||||
private void buildBasicInfo(JWTCreator.Builder builder, Duration expireAfter, String subject, String... audience) {
|
||||
var now = LocalDateTime.now();
|
||||
|
||||
// bind issuer (iss)
|
||||
builder.withIssuer(issuer);
|
||||
// bind issued at (iat)
|
||||
builder.withIssuedAt(Date.from(now.atZone(ZoneId.systemDefault()).toInstant()));
|
||||
// bind not before (nbf)
|
||||
builder.withNotBefore(Date.from(now.atZone(ZoneId.systemDefault()).toInstant()));
|
||||
// bind audience (aud)
|
||||
builder.withAudience(audience);
|
||||
// bind subject (sub)
|
||||
builder.withSubject(subject);
|
||||
// bind expire at (exp)
|
||||
builder.withExpiresAt(Date.from(now.plus(expireAfter).atZone(ZoneId.systemDefault()).toInstant()));
|
||||
// bind JWT Id (jti)
|
||||
builder.withJWTId(jtiCreator.nextId().toString());
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a claim to a builder.
|
||||
*
|
||||
* @param builder the builder to build this JSON Web Token
|
||||
* @param name the property name
|
||||
* @param value the property value
|
||||
*/
|
||||
private void addClaim(JWTCreator.Builder builder, String name, Object value) {
|
||||
if (Objects.nonNull(value)) {
|
||||
if (value instanceof Boolean v) {
|
||||
builder.withClaim(name, v);
|
||||
} else if (value instanceof Double v) {
|
||||
builder.withClaim(name, v);
|
||||
} else if (value instanceof Float v) {
|
||||
builder.withClaim(name, v.doubleValue());
|
||||
} else if (value instanceof Integer v) {
|
||||
builder.withClaim(name, v);
|
||||
} else if (value instanceof Long v) {
|
||||
builder.withClaim(name, v);
|
||||
} else if (value instanceof String v) {
|
||||
builder.withClaim(name, v);
|
||||
} else if (value instanceof Date v) {
|
||||
builder.withClaim(name, v);
|
||||
} else if (value instanceof List<?> v) {
|
||||
builder.withClaim(name, v);
|
||||
} else {
|
||||
log.warn("""
|
||||
Unable to determine the type of field {}, we will handle it as a String.""", name);
|
||||
builder.withClaim(name, value.toString());
|
||||
}
|
||||
} else {
|
||||
builder.withNullClaim(name);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Builds the custom claims of the JSON Web Token (JWT) using the provided
|
||||
* Map of claims and adds them to the JWTCreator.Builder.
|
||||
* <p>
|
||||
* This method is used to add custom claims to the JWT. It takes a Map of
|
||||
* claims, where each entry represents a custom claim name (key) and its
|
||||
* corresponding value (value). The custom claims will be added to the JWT
|
||||
* using the JWTCreator.Builder.
|
||||
*
|
||||
* @param claims a Map containing the custom claims to be added to the JWT
|
||||
* @param builder the JWTCreator.Builder instance to which the custom
|
||||
* claims will be added
|
||||
*/
|
||||
private void buildMapClaims(JWTCreator.Builder builder, Map<String, Object> claims) {
|
||||
if (Objects.nonNull(claims)) {
|
||||
for (var e : claims.entrySet()) {
|
||||
addClaim(builder, e.getKey(), e.getValue());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Finish creating a token.
|
||||
* <p>
|
||||
* This is the final step of create a token, to sign this token.
|
||||
*
|
||||
* @param builder the builder to build this JWT
|
||||
* @return the generated token as a {@code String}
|
||||
*/
|
||||
private String buildToken(JWTCreator.Builder builder) {
|
||||
return builder.sign(algorithm);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new token with the specified expiration duration, subject, and
|
||||
* audience.
|
||||
@@ -552,8 +426,137 @@ public class AuthzeroTokenResolver implements TokenResolver<DecodedJWT> {
|
||||
return renew(oldToken, Duration.ofMinutes(30), payload);
|
||||
}
|
||||
|
||||
/**
|
||||
* Builds the basic information of the JSON Web Token (JWT) using the
|
||||
* provided parameters and adds it to the JWTCreator.Builder.
|
||||
*
|
||||
* @param subject the subject claim value to be included in the JWT
|
||||
* @param audience an array of audience claim values to be included in
|
||||
* the JWT
|
||||
* @param expireAfter the duration after which the JWT will expire
|
||||
* @param builder the JWTCreator.Builder instance to which the basic
|
||||
* information will be added
|
||||
*/
|
||||
private void buildBasicInfo(JWTCreator.Builder builder, Duration expireAfter, String subject, String... audience) {
|
||||
var now = LocalDateTime.now();
|
||||
|
||||
// bind issuer (iss)
|
||||
builder.withIssuer(issuer);
|
||||
// bind issued at (iat)
|
||||
builder.withIssuedAt(Date.from(now.atZone(ZoneId.systemDefault()).toInstant()));
|
||||
// bind not before (nbf)
|
||||
builder.withNotBefore(Date.from(now.atZone(ZoneId.systemDefault()).toInstant()));
|
||||
// bind audience (aud)
|
||||
builder.withAudience(audience);
|
||||
// bind subject (sub)
|
||||
builder.withSubject(subject);
|
||||
// bind expire at (exp)
|
||||
builder.withExpiresAt(Date.from(now.plus(expireAfter).atZone(ZoneId.systemDefault()).toInstant()));
|
||||
// bind JWT Id (jti)
|
||||
builder.withJWTId(jtiCreator.nextId().toString());
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a claim to a builder.
|
||||
*
|
||||
* @param builder the builder to build this JSON Web Token
|
||||
* @param name the property name
|
||||
* @param value the property value
|
||||
*/
|
||||
private void addClaim(JWTCreator.Builder builder, String name, Object value) {
|
||||
if (Objects.nonNull(value)) {
|
||||
if (value instanceof Boolean v) {
|
||||
builder.withClaim(name, v);
|
||||
} else if (value instanceof Double v) {
|
||||
builder.withClaim(name, v);
|
||||
} else if (value instanceof Float v) {
|
||||
builder.withClaim(name, v.doubleValue());
|
||||
} else if (value instanceof Integer v) {
|
||||
builder.withClaim(name, v);
|
||||
} else if (value instanceof Long v) {
|
||||
builder.withClaim(name, v);
|
||||
} else if (value instanceof String v) {
|
||||
builder.withClaim(name, v);
|
||||
} else if (value instanceof Date v) {
|
||||
builder.withClaim(name, v);
|
||||
} else if (value instanceof List<?> v) {
|
||||
builder.withClaim(name, v);
|
||||
} else {
|
||||
log.warn("""
|
||||
Unable to determine the type of field {}, we will handle it as a String.""", name);
|
||||
builder.withClaim(name, value.toString());
|
||||
}
|
||||
} else {
|
||||
builder.withNullClaim(name);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Builds the custom claims of the JSON Web Token (JWT) using the provided
|
||||
* Map of claims and adds them to the JWTCreator.Builder.
|
||||
* <p>
|
||||
* This method is used to add custom claims to the JWT. It takes a Map of
|
||||
* claims, where each entry represents a custom claim name (key) and its
|
||||
* corresponding value (value). The custom claims will be added to the JWT
|
||||
* using the JWTCreator.Builder.
|
||||
*
|
||||
* @param claims a Map containing the custom claims to be added to the JWT
|
||||
* @param builder the JWTCreator.Builder instance to which the custom
|
||||
* claims will be added
|
||||
*/
|
||||
private void buildMapClaims(JWTCreator.Builder builder, Map<String, Object> claims) {
|
||||
if (Objects.nonNull(claims)) {
|
||||
for (var e : claims.entrySet()) {
|
||||
addClaim(builder, e.getKey(), e.getValue());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Finish creating a token.
|
||||
* <p>
|
||||
* This is the final step of create a token, to sign this token.
|
||||
*
|
||||
* @param builder the builder to build this JWT
|
||||
* @return the generated token as a {@code String}
|
||||
*/
|
||||
private String buildToken(JWTCreator.Builder builder) {
|
||||
return builder.sign(algorithm);
|
||||
}
|
||||
|
||||
/**
|
||||
* Default type reference for Map.
|
||||
*/
|
||||
private static class MapTypeReference extends TypeReference<Map<String, Object>> {
|
||||
MapTypeReference() {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* GuidCreator used for generating unique identifiers for "jti" claim in
|
||||
* JWT tokens.
|
||||
*/
|
||||
private final GuidCreator<?> jtiCreator;
|
||||
|
||||
/**
|
||||
* The algorithm used for signing and verifying JWT tokens.
|
||||
*/
|
||||
private final Algorithm algorithm;
|
||||
|
||||
/**
|
||||
* The issuer claim value to be included in JWT tokens.
|
||||
*/
|
||||
private final String issuer;
|
||||
|
||||
/**
|
||||
* The JSON Web Token resolver.
|
||||
*/
|
||||
private final JWTVerifier verifier;
|
||||
|
||||
/**
|
||||
* Jackson JSON handler.
|
||||
*/
|
||||
private final ObjectMapper objectMapper;
|
||||
|
||||
private final AuthzeroTokenResolverConfig config = AuthzeroTokenResolverConfig.getInstance();
|
||||
}
|
||||
|
||||
+36
-36
@@ -62,42 +62,6 @@ import java.util.function.Function;
|
||||
*/
|
||||
public final class AuthzeroTokenResolverConfig implements TokenResolverConfig<Function<String, Algorithm>> {
|
||||
|
||||
/**
|
||||
* Constructs a new instance of {@code AuthzeroTokenResolverConfig}.
|
||||
* <p>
|
||||
* The constructor is set as private to enforce the singleton pattern for
|
||||
* this configuration class. Instances of
|
||||
* {@code AuthzeroTokenResolverConfig} should be obtained through the
|
||||
* {@link #getInstance()} method.
|
||||
*/
|
||||
private AuthzeroTokenResolverConfig() {
|
||||
}
|
||||
|
||||
/**
|
||||
* The singleton instance of {@code AuthzeroTokenResolverConfig}.
|
||||
* <p>
|
||||
* This instance is used to ensure that only one instance of
|
||||
* {@code AuthzeroTokenResolverConfig} is created and shared throughout the
|
||||
* application. The singleton pattern is implemented to provide centralised
|
||||
* configuration and avoid redundant object creation.
|
||||
*/
|
||||
private static AuthzeroTokenResolverConfig instance;
|
||||
|
||||
/**
|
||||
* The supported algorithms and their corresponding algorithm functions.
|
||||
* <p>
|
||||
* This map stores the supported algorithms as keys and their corresponding
|
||||
* algorithm functions as values. The algorithm functions represent the
|
||||
* functions used by the {@code com.auth0:java-jwt} library to handle the
|
||||
* specific algorithms. The mapping is used to provide proper algorithm
|
||||
* resolution and processing within the {@link AuthzeroTokenResolver}.
|
||||
*/
|
||||
private static final Map<TokenAlgorithm, Function<String, Algorithm>> SUPPORTED_ALGORITHMS = new HashMap<>() {{
|
||||
put(TokenAlgorithm.HS256, Algorithm::HMAC256);
|
||||
put(TokenAlgorithm.HS384, Algorithm::HMAC384);
|
||||
put(TokenAlgorithm.HS512, Algorithm::HMAC512);
|
||||
}};
|
||||
|
||||
/**
|
||||
* Gets the instance of {@code AuthzeroTokenResolverConfig}.
|
||||
* <p>
|
||||
@@ -140,4 +104,40 @@ public final class AuthzeroTokenResolverConfig implements TokenResolverConfig<Fu
|
||||
return Optional.of(SUPPORTED_ALGORITHMS).map((entry) -> entry.get(algorithm))
|
||||
.orElseThrow(() -> new UnsupportedAlgorithmException("The specified algorithm is not supported yet."));
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructs a new instance of {@code AuthzeroTokenResolverConfig}.
|
||||
* <p>
|
||||
* The constructor is set as private to enforce the singleton pattern for
|
||||
* this configuration class. Instances of
|
||||
* {@code AuthzeroTokenResolverConfig} should be obtained through the
|
||||
* {@link #getInstance()} method.
|
||||
*/
|
||||
private AuthzeroTokenResolverConfig() {
|
||||
}
|
||||
|
||||
/**
|
||||
* The singleton instance of {@code AuthzeroTokenResolverConfig}.
|
||||
* <p>
|
||||
* This instance is used to ensure that only one instance of
|
||||
* {@code AuthzeroTokenResolverConfig} is created and shared throughout the
|
||||
* application. The singleton pattern is implemented to provide centralised
|
||||
* configuration and avoid redundant object creation.
|
||||
*/
|
||||
private static AuthzeroTokenResolverConfig instance;
|
||||
|
||||
/**
|
||||
* The supported algorithms and their corresponding algorithm functions.
|
||||
* <p>
|
||||
* This map stores the supported algorithms as keys and their corresponding
|
||||
* algorithm functions as values. The algorithm functions represent the
|
||||
* functions used by the {@code com.auth0:java-jwt} library to handle the
|
||||
* specific algorithms. The mapping is used to provide proper algorithm
|
||||
* resolution and processing within the {@link AuthzeroTokenResolver}.
|
||||
*/
|
||||
private static final Map<TokenAlgorithm, Function<String, Algorithm>> SUPPORTED_ALGORITHMS = new HashMap<>() {{
|
||||
put(TokenAlgorithm.HS256, Algorithm::HMAC256);
|
||||
put(TokenAlgorithm.HS384, Algorithm::HMAC384);
|
||||
put(TokenAlgorithm.HS512, Algorithm::HMAC512);
|
||||
}};
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user