Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
e9f2616
add: base paseto configuration
utsav0209 Oct 8, 2021
12253c2
BLD: Added JPaseto dependency
utsav0209 Oct 12, 2021
e1fda4f
CLN: Removed redundant isEnabled() in PasetoConfiguration interface
utsav0209 Oct 12, 2021
2f01114
BLD: Removed unnecessary dependencies
utsav0209 Oct 12, 2021
6902722
CLN: Cleaned build.gradle for security-paseto submodule
utsav0209 Oct 12, 2021
7fa3bfb
ENH: Added Paseto token generator
utsav0209 Oct 12, 2021
7d4e293
ENH: Added Paseto token validator
utsav0209 Oct 12, 2021
a641390
ENH: Added Shared secret property for LOCAL version
utsav0209 Oct 13, 2021
64a6ba5
ENH: Migrated paseto token configuration properties to enum types
utsav0209 Oct 13, 2021
0b16982
ENH: Added builder methods for default Paseto claims
utsav0209 Oct 13, 2021
d496a37
ENH: Added paseto generic paseto claim validator
utsav0209 Oct 15, 2021
26edf5f
ENH: Added Not before Paseto claims validator
utsav0209 Oct 15, 2021
ac7bd9f
flesh out implementation
sdelamo Oct 15, 2021
cee6b00
move token logic to micronaut-security
sdelamo Oct 18, 2021
d41fa8e
move code to security from security-jwt
sdelamo Oct 18, 2021
af86085
add missing javado
sdelamo Oct 18, 2021
e3adea3
bump up project version to 4.0.0-SNAPSHOT
sdelamo Oct 18, 2021
a67e08f
build: bump up micronaut version to 3.1.0
sdelamo Oct 18, 2021
5f49feb
remove classes which are now in security
sdelamo Oct 18, 2021
5a9f608
add doc to end javadoc sentence
sdelamo Oct 18, 2021
c9c69bf
change prefix to correct prefix
sdelamo Oct 18, 2021
77cf932
Merge branch 'master' into paseto
sdelamo Oct 18, 2021
64aba85
Merge branch 'master' into paseto
sdelamo May 16, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion gradle/libs.versions.toml
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ unboundid-ldapsdk = "6.0.8"
bouncycastle = "1.70"
kotlin = "1.8.21"
bcpkix = "1.70"

jpaseto="0.7.0"
micronaut-test = "4.0.0-M3"
micronaut-multitenancy = "5.0.0-M2"
micronaut-reactor = "3.0.0-M1"
Expand All @@ -33,6 +33,11 @@ micronaut-session = { module = "io.micronaut.session:micronaut-session-bom", ver
micronaut-views = { module = "io.micronaut.views:micronaut-views-bom", version.ref = "micronaut-views" }
micronaut-validation = { module = "io.micronaut.validation:micronaut-validation-bom", version.ref = "micronaut-validation" }

managed-jpaseto-api = { module = "dev.paseto:jpaseto-api", version.ref = "jpaseto" }
managed-jpaseto-bouncy-castle = { module = "dev.paseto:jpaseto-bouncy-castle", version.ref = "jpaseto" }
managed-jpaseto-impl = { module = "dev.paseto:jpaseto-impl", version.ref = "jpaseto" }
managed-jpaseto-jackson = { module = "dev.paseto:jpaseto-jackson", version.ref = "jpaseto" }

managed-nimbus-jose-jwt = { module = "com.nimbusds:nimbus-jose-jwt", version.ref = "managed-nimbus-jose-jwt" }
geb-spock = { module = "org.gebish:geb-spock", version.ref = "geb" }
junit-jupiter-api = { module = "org.junit.jupiter:junit-jupiter-api" }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,9 @@
import com.nimbusds.jwt.PlainJWT;
import io.micronaut.core.annotation.Nullable;
import io.micronaut.security.authentication.Authentication;
import io.micronaut.security.token.claims.ClaimsGenerator;
import io.micronaut.security.token.generator.TokenGenerator;
import io.micronaut.security.token.jwt.encryption.EncryptionConfiguration;
import io.micronaut.security.token.jwt.generator.claims.ClaimsGenerator;
import io.micronaut.security.token.jwt.signature.SignatureGeneratorConfiguration;
import jakarta.inject.Named;
import jakarta.inject.Singleton;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,10 @@
import io.micronaut.core.annotation.Nullable;
import io.micronaut.runtime.ApplicationConfiguration;
import io.micronaut.security.authentication.Authentication;
import io.micronaut.security.token.Claims;
import io.micronaut.security.token.claims.ClaimsAudienceProvider;
import io.micronaut.security.token.claims.ClaimsGenerator;
import io.micronaut.security.token.claims.JtiGenerator;
import io.micronaut.security.token.config.TokenConfiguration;
import jakarta.inject.Singleton;
import java.time.Instant;
Expand All @@ -43,7 +47,7 @@ public class JWTClaimsSetGenerator implements ClaimsGenerator {
private static final String ROLES_KEY = "rolesKey";

private final TokenConfiguration tokenConfiguration;
private final JwtIdGenerator jwtIdGenerator;
private final JtiGenerator jwtIdGenerator;
private final ClaimsAudienceProvider claimsAudienceProvider;
private final String appName;

Expand All @@ -54,7 +58,7 @@ public class JWTClaimsSetGenerator implements ClaimsGenerator {
* @param applicationConfiguration The application configuration
*/
public JWTClaimsSetGenerator(TokenConfiguration tokenConfiguration,
@Nullable JwtIdGenerator jwtIdGenerator,
@Nullable JtiGenerator jwtIdGenerator,
@Nullable ClaimsAudienceProvider claimsAudienceProvider,
@Nullable ApplicationConfiguration applicationConfiguration) {
this.tokenConfiguration = tokenConfiguration;
Expand Down Expand Up @@ -189,7 +193,7 @@ protected void populateWithAuthentication(JWTClaimsSet.Builder builder, Authenti
@Override
public Map<String, Object> generateClaimsSet(Map<String, ?> oldClaims, Integer expiration) {
JWTClaimsSet.Builder builder = new JWTClaimsSet.Builder();
List<String> excludedClaims = Arrays.asList(JwtClaims.EXPIRATION_TIME, JwtClaims.ISSUED_AT, JwtClaims.NOT_BEFORE);
List<String> excludedClaims = Arrays.asList(Claims.EXPIRATION_TIME, Claims.ISSUED_AT, Claims.NOT_BEFORE);
for (String k : oldClaims.keySet()
.stream()
.filter(p -> !excludedClaims.contains(p))
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -18,15 +18,17 @@
import com.nimbusds.jwt.JWTClaimsSet;
import io.micronaut.core.annotation.NonNull;
import io.micronaut.core.annotation.Nullable;
import io.micronaut.security.token.Claims;

import java.util.Set;

/**
* Adapts from {@link JWTClaimsSet} to {@link JwtClaims}.
* Adapts from {@link JWTClaimsSet} to {@link Claims}.
*
* @author Sergio del Amo
* @since 1.1.0
*/
public class JwtClaimsSetAdapter implements JwtClaims {
public class JwtClaimsSetAdapter implements Claims {

private final JWTClaimsSet jwtClaimsSet;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,14 +15,14 @@
*/
package io.micronaut.security.token.jwt.validator;

import java.util.List;
import io.micronaut.security.token.Claims;
import jakarta.inject.Singleton;
import com.nimbusds.jwt.JWTClaimsSet;
import io.micronaut.context.annotation.Requires;
import io.micronaut.core.annotation.NonNull;
import io.micronaut.core.annotation.Nullable;
import io.micronaut.http.HttpRequest;
import io.micronaut.security.token.jwt.generator.claims.JwtClaims;
import jakarta.inject.Singleton;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

Expand Down Expand Up @@ -80,7 +80,7 @@ protected boolean validate(JWTClaimsSet claimsSet) {
}

@Override
public boolean validate(@NonNull JwtClaims claims,
public boolean validate(@NonNull Claims claims,
@Nullable HttpRequest<?> request) {
return validate(JWTClaimsSetUtils.jwtClaimsSetFromClaims(claims));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,14 +18,15 @@
import com.nimbusds.jwt.JWT;
import com.nimbusds.jwt.JWTClaimsSet;
import io.micronaut.security.authentication.Authentication;
import io.micronaut.security.token.AbstractTokenAuthenticationFactory;
import io.micronaut.security.token.MapClaims;
import io.micronaut.security.token.RolesFinder;
import io.micronaut.security.token.config.TokenConfiguration;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import jakarta.inject.Singleton;
import java.text.ParseException;
import java.util.Map;
import java.util.Optional;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
* Extracts the JWT claims and uses the {@link AuthenticationJWTClaimsSetAdapter} to construction an {@link Authentication} object.
Expand All @@ -34,17 +35,18 @@
* @since 1.1.0
*/
@Singleton
public class DefaultJwtAuthenticationFactory implements JwtAuthenticationFactory {
public class DefaultJwtAuthenticationFactory extends AbstractTokenAuthenticationFactory<JWT> implements JwtAuthenticationFactory {

private static final Logger LOG = LoggerFactory.getLogger(DefaultJwtAuthenticationFactory.class);

private final TokenConfiguration tokenConfiguration;
private final RolesFinder rolesFinder;

/**
*
* @param tokenConfiguration Token Configuration
* @param rolesFinder Utility to retrieve roles from token claims
*/
public DefaultJwtAuthenticationFactory(TokenConfiguration tokenConfiguration,
RolesFinder rolesFinder) {
this.tokenConfiguration = tokenConfiguration;
this.rolesFinder = rolesFinder;
super(tokenConfiguration, rolesFinder);
}

@Override
Expand All @@ -54,11 +56,7 @@ public Optional<Authentication> createAuthentication(JWT token) {
if (claimSet == null) {
return Optional.empty();
}
Map<String, Object> attributes = claimSet.getClaims();
return usernameForClaims(claimSet).map(username ->
Authentication.build(username,
rolesFinder.resolveRoles(attributes),
attributes));
return createAuthentication(claimSet.getClaims());
} catch (ParseException e) {
if (LOG.isErrorEnabled()) {
LOG.error("ParseException creating authentication", e);
Expand All @@ -71,13 +69,11 @@ public Optional<Authentication> createAuthentication(JWT token) {
*
* @param claimSet JWT Claims
* @return the username defined by {@link TokenConfiguration#getNameKey()} ()} or the sub claim.
* @deprecated Use {@link AbstractTokenAuthenticationFactory#usernameForClaims(io.micronaut.security.token.Claims)} instead.
* @throws ParseException might be thrown parsing claims
*/
@Deprecated
protected Optional<String> usernameForClaims(JWTClaimsSet claimSet) throws ParseException {
String username = claimSet.getStringClaim(tokenConfiguration.getNameKey());
if (username == null) {
return Optional.ofNullable(claimSet.getSubject());
}
return Optional.of(username);
return super.usernameForClaims(new MapClaims(claimSet.getClaims()));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,11 +21,11 @@
import io.micronaut.core.annotation.Nullable;
import io.micronaut.core.util.StringUtils;
import io.micronaut.http.HttpRequest;
import io.micronaut.security.token.jwt.generator.claims.JwtClaims;
import jakarta.inject.Singleton;
import java.util.Date;
import io.micronaut.security.token.Claims;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import jakarta.inject.Singleton;
import java.util.Date;

/**
* Validate JWT is not expired.
Expand Down Expand Up @@ -59,7 +59,7 @@ protected boolean validate(@NonNull JWTClaimsSet claimsSet) {
}

@Override
public boolean validate(@NonNull JwtClaims claims, @Nullable HttpRequest<?> request) {
public boolean validate(@NonNull Claims claims, @Nullable HttpRequest<?> request) {
return validate(JWTClaimsSetUtils.jwtClaimsSetFromClaims(claims));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
import io.micronaut.core.annotation.NonNull;
import io.micronaut.core.annotation.Nullable;
import io.micronaut.http.HttpRequest;
import io.micronaut.security.token.jwt.generator.claims.JwtClaims;
import io.micronaut.security.token.Claims;
import jakarta.inject.Singleton;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
Expand Down Expand Up @@ -54,11 +54,11 @@ public IssuerJwtClaimsValidator(JwtClaimsValidatorConfiguration jwtClaimsValidat
}

@Override
public boolean validate(@NonNull JwtClaims claims, @Nullable HttpRequest<?> request) {
public boolean validate(@NonNull Claims claims, @Nullable HttpRequest<?> request) {
if (expectedIssuer == null) {
return true;
}
Object issuerObject = claims.get(JwtClaims.ISSUER);
Object issuerObject = claims.get(Claims.ISSUER);
if (issuerObject == null) {
if (LOG.isTraceEnabled()) {
LOG.trace("Expected JWT issuer claim of '{}', but the token did not include an issuer.", expectedIssuer);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
package io.micronaut.security.token.jwt.validator;

import com.nimbusds.jwt.JWTClaimsSet;
import io.micronaut.security.token.jwt.generator.claims.JwtClaims;
import io.micronaut.security.token.Claims;

/**
* Utils class to instantiate a JWClaimsSet give a map of claims.
Expand All @@ -34,7 +34,7 @@ private JWTClaimsSetUtils() {
* @param claims JWT claims
* @return A JWTClaimsSet
*/
public static JWTClaimsSet jwtClaimsSetFromClaims(JwtClaims claims) {
public static JWTClaimsSet jwtClaimsSetFromClaims(Claims claims) {
JWTClaimsSet.Builder claimsSetBuilder = new JWTClaimsSet.Builder();
for (String k : claims.names()) {
claimsSetBuilder.claim(k, claims.get(k));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
import io.micronaut.core.annotation.NonNull;
import io.micronaut.core.annotation.Nullable;
import io.micronaut.http.HttpRequest;
import io.micronaut.security.token.jwt.generator.claims.JwtClaims;
import io.micronaut.security.token.Claims;

/**
* Provides a contract to create custom JWT claims validations.
Expand All @@ -33,5 +33,5 @@ public interface JwtClaimsValidator {
* @param request HTTP request
* @return whether the JWT claims pass validation.
*/
boolean validate(@NonNull JwtClaims claims, @Nullable HttpRequest<?> request);
boolean validate(@NonNull Claims claims, @Nullable HttpRequest<?> request);
}
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,8 @@
import io.micronaut.core.annotation.NonNull;
import io.micronaut.core.annotation.Nullable;
import io.micronaut.http.HttpRequest;
import io.micronaut.security.token.Claims;
import io.micronaut.security.token.jwt.encryption.EncryptionConfiguration;
import io.micronaut.security.token.jwt.generator.claims.JwtClaims;
import io.micronaut.security.token.jwt.generator.claims.JwtClaimsSetAdapter;
import io.micronaut.security.token.jwt.signature.SignatureConfiguration;
import io.micronaut.security.token.jwt.signature.jwks.JwksCache;
Expand Down Expand Up @@ -125,7 +125,7 @@ public Optional<JWT> validate(@NonNull JWT token, @Nullable HttpRequest<?> reque
} else {
return validationResult.filter(jwt -> {
try {
JwtClaims claims = new JwtClaimsSetAdapter(jwt.getJWTClaimsSet());
Claims claims = new JwtClaimsSetAdapter(jwt.getJWTClaimsSet());
return claimsValidators.stream().allMatch(validator -> validator.validate(claims, request));
} catch (ParseException e) {
if (LOG.isErrorEnabled()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,13 @@
import io.micronaut.core.annotation.Nullable;
import io.micronaut.core.util.StringUtils;
import io.micronaut.http.HttpRequest;
import io.micronaut.security.token.jwt.generator.claims.JwtClaims;
import io.micronaut.security.token.Claims;
import jakarta.inject.Singleton;
import java.util.Date;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Date;

/**
* Validate current time is not before the not-before claim of a JWT token.
*
Expand Down Expand Up @@ -72,7 +73,7 @@ protected boolean validate(@NonNull JWTClaimsSet claimsSet) {
* @return true if the not-before claim denotes a date before now
*/
@Override
public boolean validate(@NonNull JwtClaims claims, @Nullable HttpRequest<?> request) {
public boolean validate(@NonNull Claims claims, @Nullable HttpRequest<?> request) {
return validate(JWTClaimsSetUtils.jwtClaimsSetFromClaims(claims));
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
import io.micronaut.core.annotation.Nullable;
import io.micronaut.core.util.StringUtils;
import io.micronaut.http.HttpRequest;
import io.micronaut.security.token.jwt.generator.claims.JwtClaims;
import io.micronaut.security.token.Claims;
import jakarta.inject.Singleton;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
Expand Down Expand Up @@ -53,7 +53,7 @@ public boolean validate(JWTClaimsSet claimsSet) {
}

@Override
public boolean validate(@NonNull JwtClaims claims, @Nullable HttpRequest<?> request) {
public boolean validate(@NonNull Claims claims, @Nullable HttpRequest<?> request) {
return validate(JWTClaimsSetUtils.jwtClaimsSetFromClaims(claims));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import io.micronaut.http.MediaType
import io.micronaut.security.authentication.Authentication
import io.micronaut.security.authentication.UsernamePasswordCredentials
import io.micronaut.security.testutils.EmbeddedServerSpecification
import io.micronaut.security.token.jwt.render.AccessRefreshToken
import io.micronaut.security.token.render.AccessRefreshToken
import io.micronaut.security.token.jwt.validator.JwtTokenValidator
import io.micronaut.security.token.validator.TokenValidator
import reactor.core.publisher.Flux
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import io.micronaut.security.authentication.UsernamePasswordCredentials
import io.micronaut.security.testutils.EmbeddedServerSpecification
import io.micronaut.security.testutils.authprovider.MockAuthenticationProvider
import io.micronaut.security.testutils.authprovider.SuccessAuthenticationScenario
import io.micronaut.security.token.jwt.render.BearerAccessRefreshToken
import io.micronaut.security.token.render.BearerAccessRefreshToken
import jakarta.inject.Singleton

class IntrospectionEndpointSpec extends EmbeddedServerSpecification {
Expand Down
Loading