|
@@ -1,5 +1,5 @@
|
|
/*
|
|
/*
|
|
- * Copyright 2002-2021 the original author or authors.
|
|
|
|
|
|
+ * Copyright 2002-2022 the original author or authors.
|
|
*
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* you may not use this file except in compliance with the License.
|
|
@@ -22,6 +22,7 @@ import java.util.Collections;
|
|
import java.util.Map;
|
|
import java.util.Map;
|
|
import java.util.UUID;
|
|
import java.util.UUID;
|
|
import java.util.concurrent.ConcurrentHashMap;
|
|
import java.util.concurrent.ConcurrentHashMap;
|
|
|
|
+import java.util.function.Consumer;
|
|
import java.util.function.Function;
|
|
import java.util.function.Function;
|
|
|
|
|
|
import com.nimbusds.jose.jwk.JWK;
|
|
import com.nimbusds.jose.jwk.JWK;
|
|
@@ -62,6 +63,7 @@ import org.springframework.util.MultiValueMap;
|
|
*
|
|
*
|
|
* @param <T> the type of {@link AbstractOAuth2AuthorizationGrantRequest}
|
|
* @param <T> the type of {@link AbstractOAuth2AuthorizationGrantRequest}
|
|
* @author Joe Grandja
|
|
* @author Joe Grandja
|
|
|
|
+ * @author Steve Riesenberg
|
|
* @since 5.5
|
|
* @since 5.5
|
|
* @see Converter
|
|
* @see Converter
|
|
* @see com.nimbusds.jose.jwk.JWK
|
|
* @see com.nimbusds.jose.jwk.JWK
|
|
@@ -87,6 +89,9 @@ public final class NimbusJwtClientAuthenticationParametersConverter<T extends Ab
|
|
|
|
|
|
private final Map<String, JwsEncoderHolder> jwsEncoders = new ConcurrentHashMap<>();
|
|
private final Map<String, JwsEncoderHolder> jwsEncoders = new ConcurrentHashMap<>();
|
|
|
|
|
|
|
|
+ private Consumer<JwtClientAuthenticationContext<T>> jwtClientAssertionCustomizer = (context) -> {
|
|
|
|
+ };
|
|
|
|
+
|
|
/**
|
|
/**
|
|
* Constructs a {@code NimbusJwtClientAuthenticationParametersConverter} using the
|
|
* Constructs a {@code NimbusJwtClientAuthenticationParametersConverter} using the
|
|
* provided parameters.
|
|
* provided parameters.
|
|
@@ -142,6 +147,10 @@ public final class NimbusJwtClientAuthenticationParametersConverter<T extends Ab
|
|
.expiresAt(expiresAt);
|
|
.expiresAt(expiresAt);
|
|
// @formatter:on
|
|
// @formatter:on
|
|
|
|
|
|
|
|
+ JwtClientAuthenticationContext<T> jwtClientAssertionContext = new JwtClientAuthenticationContext<>(
|
|
|
|
+ authorizationGrantRequest, headersBuilder, claimsBuilder);
|
|
|
|
+ this.jwtClientAssertionCustomizer.accept(jwtClientAssertionContext);
|
|
|
|
+
|
|
JwsHeader jwsHeader = headersBuilder.build();
|
|
JwsHeader jwsHeader = headersBuilder.build();
|
|
JwtClaimsSet jwtClaimsSet = claimsBuilder.build();
|
|
JwtClaimsSet jwtClaimsSet = claimsBuilder.build();
|
|
|
|
|
|
@@ -189,6 +198,21 @@ public final class NimbusJwtClientAuthenticationParametersConverter<T extends Ab
|
|
return jwsAlgorithm;
|
|
return jwsAlgorithm;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
+ * Sets the {@link Consumer} to be provided the
|
|
|
|
+ * {@link JwtClientAuthenticationContext}, which contains the
|
|
|
|
+ * {@link JwsHeader.Builder} and {@link JwtClaimsSet.Builder} for further
|
|
|
|
+ * customization.
|
|
|
|
+ * @param jwtClientAssertionCustomizer the {@link Consumer} to be provided the
|
|
|
|
+ * {@link JwtClientAuthenticationContext}
|
|
|
|
+ * @since 5.7
|
|
|
|
+ */
|
|
|
|
+ public void setJwtClientAssertionCustomizer(
|
|
|
|
+ Consumer<JwtClientAuthenticationContext<T>> jwtClientAssertionCustomizer) {
|
|
|
|
+ Assert.notNull(jwtClientAssertionCustomizer, "jwtClientAssertionCustomizer cannot be null");
|
|
|
|
+ this.jwtClientAssertionCustomizer = jwtClientAssertionCustomizer;
|
|
|
|
+ }
|
|
|
|
+
|
|
private static final class JwsEncoderHolder {
|
|
private static final class JwsEncoderHolder {
|
|
|
|
|
|
private final JwtEncoder jwsEncoder;
|
|
private final JwtEncoder jwsEncoder;
|
|
@@ -210,4 +234,59 @@ public final class NimbusJwtClientAuthenticationParametersConverter<T extends Ab
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
+ * A context that holds client authentication-specific state and is used by
|
|
|
|
+ * {@link NimbusJwtClientAuthenticationParametersConverter} when attempting to
|
|
|
|
+ * customize the JSON Web Token (JWS) client assertion.
|
|
|
|
+ *
|
|
|
|
+ * @param <T> the type of {@link AbstractOAuth2AuthorizationGrantRequest}
|
|
|
|
+ * @since 5.7
|
|
|
|
+ */
|
|
|
|
+ public static final class JwtClientAuthenticationContext<T extends AbstractOAuth2AuthorizationGrantRequest> {
|
|
|
|
+
|
|
|
|
+ private final T authorizationGrantRequest;
|
|
|
|
+
|
|
|
|
+ private final JwsHeader.Builder headers;
|
|
|
|
+
|
|
|
|
+ private final JwtClaimsSet.Builder claims;
|
|
|
|
+
|
|
|
|
+ private JwtClientAuthenticationContext(T authorizationGrantRequest, JwsHeader.Builder headers,
|
|
|
|
+ JwtClaimsSet.Builder claims) {
|
|
|
|
+ this.authorizationGrantRequest = authorizationGrantRequest;
|
|
|
|
+ this.headers = headers;
|
|
|
|
+ this.claims = claims;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * Returns the {@link AbstractOAuth2AuthorizationGrantRequest authorization grant
|
|
|
|
+ * request}.
|
|
|
|
+ * @return the {@link AbstractOAuth2AuthorizationGrantRequest authorization grant
|
|
|
|
+ * request}
|
|
|
|
+ */
|
|
|
|
+ public T getAuthorizationGrantRequest() {
|
|
|
|
+ return this.authorizationGrantRequest;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * Returns the {@link JwsHeader.Builder} to be used to customize headers of the
|
|
|
|
+ * JSON Web Token (JWS).
|
|
|
|
+ * @return the {@link JwsHeader.Builder} to be used to customize headers of the
|
|
|
|
+ * JSON Web Token (JWS)
|
|
|
|
+ */
|
|
|
|
+ public JwsHeader.Builder getHeaders() {
|
|
|
|
+ return this.headers;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * Returns the {@link JwtClaimsSet.Builder} to be used to customize claims of the
|
|
|
|
+ * JSON Web Token (JWS).
|
|
|
|
+ * @return the {@link JwtClaimsSet.Builder} to be used to customize claims of the
|
|
|
|
+ * JSON Web Token (JWS)
|
|
|
|
+ */
|
|
|
|
+ public JwtClaimsSet.Builder getClaims() {
|
|
|
|
+ return this.claims;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
}
|
|
}
|