23
23
import java .util .Set ;
24
24
import java .util .UUID ;
25
25
import java .util .concurrent .ConcurrentHashMap ;
26
- import java .util .concurrent .atomic .AtomicReference ;
27
- import java .util .function .BiConsumer ;
28
26
import java .util .stream .Collectors ;
29
27
30
28
import com .nimbusds .jose .JOSEException ;
46
44
import com .nimbusds .jwt .SignedJWT ;
47
45
48
46
import org .springframework .core .convert .converter .Converter ;
49
- import org .springframework .security .oauth2 .jose .jws .JwsAlgorithm ;
50
47
import org .springframework .util .Assert ;
51
48
import org .springframework .util .CollectionUtils ;
52
49
import org .springframework .util .StringUtils ;
@@ -88,9 +85,6 @@ public final class NimbusJwsEncoder implements JwtEncoder {
88
85
89
86
private final JWKSource <SecurityContext > jwkSource ;
90
87
91
- private BiConsumer <JoseHeader .Builder , JwtClaimsSet .Builder > jwtCustomizer = (headers , claims ) -> {
92
- };
93
-
94
88
/**
95
89
* Constructs a {@code NimbusJwsEncoder} using the provided parameters.
96
90
* @param jwkSource the {@code com.nimbusds.jose.jwk.source.JWKSource}
@@ -100,32 +94,12 @@ public NimbusJwsEncoder(JWKSource<SecurityContext> jwkSource) {
100
94
this .jwkSource = jwkSource ;
101
95
}
102
96
103
- /**
104
- * Sets the {@link Jwt} customizer to be provided the {@link JoseHeader.Builder} and
105
- * {@link JwtClaimsSet.Builder} allowing for further customizations.
106
- * @param jwtCustomizer the {@link Jwt} customizer to be provided the
107
- * {@link JoseHeader.Builder} and {@link JwtClaimsSet.Builder}
108
- */
109
- public void setJwtCustomizer (BiConsumer <JoseHeader .Builder , JwtClaimsSet .Builder > jwtCustomizer ) {
110
- Assert .notNull (jwtCustomizer , "jwtCustomizer cannot be null" );
111
- this .jwtCustomizer = jwtCustomizer ;
112
- }
113
-
114
97
@ Override
115
98
public Jwt encode (JoseHeader headers , JwtClaimsSet claims ) throws JwtEncodingException {
116
99
Assert .notNull (headers , "headers cannot be null" );
117
100
Assert .notNull (claims , "claims cannot be null" );
118
101
119
- // @formatter:off
120
- JoseHeader .Builder headersBuilder = JoseHeader .from (headers )
121
- .type (JOSEObjectType .JWT .getType ());
122
- JwtClaimsSet .Builder claimsBuilder = JwtClaimsSet .from (claims )
123
- .id (UUID .randomUUID ().toString ());
124
- // @formatter:on
125
-
126
- this .jwtCustomizer .accept (headersBuilder , claimsBuilder );
127
-
128
- JWK jwk = selectJwk (headersBuilder );
102
+ JWK jwk = selectJwk (headers );
129
103
if (jwk == null ) {
130
104
throw new JwtEncodingException (
131
105
String .format (ENCODING_ERROR_MESSAGE_TEMPLATE , "Failed to select a JWK signing key" ));
@@ -135,8 +109,15 @@ else if (!StringUtils.hasText(jwk.getKeyID())) {
135
109
"The \" kid\" (key ID) from the selected JWK cannot be empty" ));
136
110
}
137
111
138
- headers = headersBuilder .keyId (jwk .getKeyID ()).build ();
139
- claims = claimsBuilder .build ();
112
+ // @formatter:off
113
+ headers = JoseHeader .from (headers )
114
+ .type (JOSEObjectType .JWT .getType ())
115
+ .keyId (jwk .getKeyID ())
116
+ .build ();
117
+ claims = JwtClaimsSet .from (claims )
118
+ .id (UUID .randomUUID ().toString ())
119
+ .build ();
120
+ // @formatter:on
140
121
141
122
JWSHeader jwsHeader = JWS_HEADER_CONVERTER .convert (headers );
142
123
JWTClaimsSet jwtClaimsSet = JWT_CLAIMS_SET_CONVERTER .convert (claims );
@@ -164,13 +145,9 @@ else if (!StringUtils.hasText(jwk.getKeyID())) {
164
145
return new Jwt (jws , claims .getIssuedAt (), claims .getExpiresAt (), headers .getHeaders (), claims .getClaims ());
165
146
}
166
147
167
- private JWK selectJwk (JoseHeader .Builder headersBuilder ) {
168
- final AtomicReference <JWSAlgorithm > jwsAlgorithm = new AtomicReference <>();
169
- headersBuilder .headers ((h ) -> {
170
- JwsAlgorithm jwsAlg = (JwsAlgorithm ) h .get (JoseHeaderNames .ALG );
171
- jwsAlgorithm .set (JWSAlgorithm .parse (jwsAlg .getName ()));
172
- });
173
- JWSHeader jwsHeader = new JWSHeader (jwsAlgorithm .get ());
148
+ private JWK selectJwk (JoseHeader headers ) {
149
+ JWSAlgorithm jwsAlgorithm = JWSAlgorithm .parse (headers .getJwsAlgorithm ().getName ());
150
+ JWSHeader jwsHeader = new JWSHeader (jwsAlgorithm );
174
151
JWKSelector jwkSelector = new JWKSelector (JWKMatcher .forJWSHeader (jwsHeader ));
175
152
176
153
List <JWK > jwks ;
@@ -184,7 +161,7 @@ private JWK selectJwk(JoseHeader.Builder headersBuilder) {
184
161
185
162
if (jwks .size () > 1 ) {
186
163
throw new JwtEncodingException (String .format (ENCODING_ERROR_MESSAGE_TEMPLATE ,
187
- "Found multiple JWK signing keys for algorithm '" + jwsAlgorithm .get (). getName () + "'" ));
164
+ "Found multiple JWK signing keys for algorithm '" + jwsAlgorithm .getName () + "'" ));
188
165
}
189
166
190
167
return !jwks .isEmpty () ? jwks .get (0 ) : null ;
0 commit comments