Skip to content

Commit b7a3b3a

Browse files
injecting clock when we are generating the token
1 parent 40d503a commit b7a3b3a

File tree

11 files changed

+36
-17
lines changed

11 files changed

+36
-17
lines changed

docs/modules/ROOT/pages/core-model-components.adoc

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -392,7 +392,7 @@ The following example shows how to register an `OAuth2TokenGenerator` `@Bean`:
392392
@Bean
393393
public OAuth2TokenGenerator<?> tokenGenerator() {
394394
JwtEncoder jwtEncoder = ...
395-
JwtGenerator jwtGenerator = new JwtGenerator(jwtEncoder);
395+
JwtGenerator jwtGenerator = new JwtGenerator(jwtEncoder, Clock.systemUTC());
396396
OAuth2AccessTokenGenerator accessTokenGenerator = new OAuth2AccessTokenGenerator();
397397
OAuth2RefreshTokenGenerator refreshTokenGenerator = new OAuth2RefreshTokenGenerator();
398398
return new DelegatingOAuth2TokenGenerator(
@@ -440,7 +440,7 @@ The following example shows how to implement an `OAuth2TokenCustomizer<OAuth2Tok
440440
@Bean
441441
public OAuth2TokenGenerator<?> tokenGenerator() {
442442
JwtEncoder jwtEncoder = ...
443-
JwtGenerator jwtGenerator = new JwtGenerator(jwtEncoder);
443+
JwtGenerator jwtGenerator = new JwtGenerator(jwtEncoder, Clock.systemUTC());
444444
OAuth2AccessTokenGenerator accessTokenGenerator = new OAuth2AccessTokenGenerator();
445445
accessTokenGenerator.setAccessTokenCustomizer(accessTokenCustomizer());
446446
OAuth2RefreshTokenGenerator refreshTokenGenerator = new OAuth2RefreshTokenGenerator();
@@ -472,7 +472,7 @@ The following example shows how to implement an `OAuth2TokenCustomizer<JwtEncodi
472472
@Bean
473473
public OAuth2TokenGenerator<?> tokenGenerator() {
474474
JwtEncoder jwtEncoder = ...
475-
JwtGenerator jwtGenerator = new JwtGenerator(jwtEncoder);
475+
JwtGenerator jwtGenerator = new JwtGenerator(jwtEncoder, Clock.systemUTC());
476476
jwtGenerator.setJwtCustomizer(jwtCustomizer());
477477
OAuth2AccessTokenGenerator accessTokenGenerator = new OAuth2AccessTokenGenerator();
478478
OAuth2RefreshTokenGenerator refreshTokenGenerator = new OAuth2RefreshTokenGenerator();

docs/src/main/java/sample/extgrant/SecurityConfig.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
*/
1616
package sample.extgrant;
1717

18+
import java.time.Clock;
1819
import java.util.UUID;
1920

2021
import com.nimbusds.jose.jwk.source.JWKSource;
@@ -99,7 +100,7 @@ OAuth2AuthorizationService authorizationService() {
99100

100101
@Bean
101102
OAuth2TokenGenerator<?> tokenGenerator(JWKSource<SecurityContext> jwkSource) {
102-
JwtGenerator jwtGenerator = new JwtGenerator(new NimbusJwtEncoder(jwkSource));
103+
JwtGenerator jwtGenerator = new JwtGenerator(new NimbusJwtEncoder(jwkSource), Clock.systemUTC());
103104
OAuth2AccessTokenGenerator accessTokenGenerator = new OAuth2AccessTokenGenerator();
104105
OAuth2RefreshTokenGenerator refreshTokenGenerator = new OAuth2RefreshTokenGenerator();
105106
return new DelegatingOAuth2TokenGenerator(

oauth2-authorization-server/src/main/java/org/springframework/security/oauth2/server/authorization/config/annotation/web/configurers/OAuth2ConfigurerUtils.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
*/
1616
package org.springframework.security.oauth2.server.authorization.config.annotation.web.configurers;
1717

18+
import java.time.Clock;
1819
import java.util.Map;
1920

2021
import com.nimbusds.jose.jwk.source.JWKSource;
@@ -127,7 +128,7 @@ private static JwtGenerator getJwtGenerator(HttpSecurity httpSecurity) {
127128
if (jwtGenerator == null) {
128129
JwtEncoder jwtEncoder = getJwtEncoder(httpSecurity);
129130
if (jwtEncoder != null) {
130-
jwtGenerator = new JwtGenerator(jwtEncoder);
131+
jwtGenerator = new JwtGenerator(jwtEncoder, Clock.systemUTC());
131132
jwtGenerator.setJwtCustomizer(getJwtCustomizer(httpSecurity));
132133
httpSecurity.setSharedObject(JwtGenerator.class, jwtGenerator);
133134
}

oauth2-authorization-server/src/main/java/org/springframework/security/oauth2/server/authorization/token/JwtGenerator.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
*/
1616
package org.springframework.security.oauth2.server.authorization.token;
1717

18+
import java.time.Clock;
1819
import java.time.Instant;
1920
import java.time.temporal.ChronoUnit;
2021
import java.util.Collections;
@@ -61,16 +62,19 @@
6162
public final class JwtGenerator implements OAuth2TokenGenerator<Jwt> {
6263

6364
private final JwtEncoder jwtEncoder;
65+
private final Clock clock;
6466

6567
private OAuth2TokenCustomizer<JwtEncodingContext> jwtCustomizer;
6668

6769
/**
6870
* Constructs a {@code JwtGenerator} using the provided parameters.
6971
* @param jwtEncoder the jwt encoder
7072
*/
71-
public JwtGenerator(JwtEncoder jwtEncoder) {
73+
public JwtGenerator(JwtEncoder jwtEncoder, Clock clock) {
7274
Assert.notNull(jwtEncoder, "jwtEncoder cannot be null");
75+
Assert.notNull(clock, "clock cannot be null");
7376
this.jwtEncoder = jwtEncoder;
77+
this.clock = clock;
7478
}
7579

7680
@Nullable
@@ -94,7 +98,7 @@ public Jwt generate(OAuth2TokenContext context) {
9498
}
9599
RegisteredClient registeredClient = context.getRegisteredClient();
96100

97-
Instant issuedAt = Instant.now();
101+
Instant issuedAt = clock.instant();
98102
Instant expiresAt;
99103
JwsAlgorithm jwsAlgorithm = SignatureAlgorithm.RS256;
100104
if (OidcParameterNames.ID_TOKEN.equals(context.getTokenType().getValue())) {

oauth2-authorization-server/src/test/java/org/springframework/security/oauth2/server/authorization/authentication/OAuth2AuthorizationCodeAuthenticationProviderTests.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import java.security.MessageDigest;
2020
import java.security.NoSuchAlgorithmException;
2121
import java.security.Principal;
22+
import java.time.Clock;
2223
import java.time.Duration;
2324
import java.time.Instant;
2425
import java.time.temporal.ChronoUnit;
@@ -132,7 +133,7 @@ public void setUp() {
132133
this.authorizationService = mock(OAuth2AuthorizationService.class);
133134
this.jwtEncoder = mock(JwtEncoder.class);
134135
this.jwtCustomizer = mock(OAuth2TokenCustomizer.class);
135-
JwtGenerator jwtGenerator = new JwtGenerator(this.jwtEncoder);
136+
JwtGenerator jwtGenerator = new JwtGenerator(this.jwtEncoder, Clock.systemUTC());
136137
jwtGenerator.setJwtCustomizer(this.jwtCustomizer);
137138
this.accessTokenCustomizer = mock(OAuth2TokenCustomizer.class);
138139
OAuth2AccessTokenGenerator accessTokenGenerator = new OAuth2AccessTokenGenerator();

oauth2-authorization-server/src/test/java/org/springframework/security/oauth2/server/authorization/authentication/OAuth2ClientCredentialsAuthenticationProviderTests.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
*/
1616
package org.springframework.security.oauth2.server.authorization.authentication;
1717

18+
import java.time.Clock;
1819
import java.time.Instant;
1920
import java.time.temporal.ChronoUnit;
2021
import java.util.Collections;
@@ -104,7 +105,7 @@ public void setUp() {
104105
this.authorizationService = mock(OAuth2AuthorizationService.class);
105106
this.jwtEncoder = mock(JwtEncoder.class);
106107
this.jwtCustomizer = mock(OAuth2TokenCustomizer.class);
107-
JwtGenerator jwtGenerator = new JwtGenerator(this.jwtEncoder);
108+
JwtGenerator jwtGenerator = new JwtGenerator(this.jwtEncoder, Clock.systemUTC());
108109
jwtGenerator.setJwtCustomizer(this.jwtCustomizer);
109110
this.accessTokenCustomizer = mock(OAuth2TokenCustomizer.class);
110111
OAuth2AccessTokenGenerator accessTokenGenerator = new OAuth2AccessTokenGenerator();

oauth2-authorization-server/src/test/java/org/springframework/security/oauth2/server/authorization/authentication/OAuth2RefreshTokenAuthenticationProviderTests.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
package org.springframework.security.oauth2.server.authorization.authentication;
1717

1818
import java.security.Principal;
19+
import java.time.Clock;
1920
import java.time.Instant;
2021
import java.time.temporal.ChronoUnit;
2122
import java.util.Collections;
@@ -119,7 +120,7 @@ public void setUp() {
119120
this.jwtEncoder = mock(JwtEncoder.class);
120121
given(this.jwtEncoder.encode(any())).willReturn(createJwt(Collections.singleton("scope1")));
121122
this.jwtCustomizer = mock(OAuth2TokenCustomizer.class);
122-
JwtGenerator jwtGenerator = new JwtGenerator(this.jwtEncoder);
123+
JwtGenerator jwtGenerator = new JwtGenerator(this.jwtEncoder, Clock.systemUTC());
123124
jwtGenerator.setJwtCustomizer(this.jwtCustomizer);
124125
this.accessTokenCustomizer = mock(OAuth2TokenCustomizer.class);
125126
OAuth2AccessTokenGenerator accessTokenGenerator = new OAuth2AccessTokenGenerator();

oauth2-authorization-server/src/test/java/org/springframework/security/oauth2/server/authorization/config/annotation/web/configurers/OAuth2AuthorizationCodeGrantTests.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import java.nio.charset.StandardCharsets;
2222
import java.security.Principal;
2323
import java.text.MessageFormat;
24+
import java.time.Clock;
2425
import java.time.Instant;
2526
import java.time.temporal.ChronoUnit;
2627
import java.util.Arrays;
@@ -1233,7 +1234,7 @@ JwtEncoder jwtEncoder() {
12331234

12341235
@Bean
12351236
OAuth2TokenGenerator<?> tokenGenerator() {
1236-
JwtGenerator jwtGenerator = new JwtGenerator(jwtEncoder());
1237+
JwtGenerator jwtGenerator = new JwtGenerator(jwtEncoder(), Clock.systemUTC());
12371238
jwtGenerator.setJwtCustomizer(jwtCustomizer());
12381239
OAuth2TokenGenerator<OAuth2RefreshToken> refreshTokenGenerator = new CustomRefreshTokenGenerator();
12391240
return new DelegatingOAuth2TokenGenerator(jwtGenerator, refreshTokenGenerator);
@@ -1295,7 +1296,7 @@ JwtEncoder jwtEncoder() {
12951296

12961297
@Bean
12971298
OAuth2TokenGenerator<?> tokenGenerator() {
1298-
JwtGenerator jwtGenerator = new JwtGenerator(jwtEncoder());
1299+
JwtGenerator jwtGenerator = new JwtGenerator(jwtEncoder(), Clock.systemUTC());
12991300
jwtGenerator.setJwtCustomizer(jwtCustomizer());
13001301
OAuth2RefreshTokenGenerator refreshTokenGenerator = new OAuth2RefreshTokenGenerator();
13011302
OAuth2TokenGenerator<OAuth2Token> delegatingTokenGenerator = new DelegatingOAuth2TokenGenerator(

oauth2-authorization-server/src/test/java/org/springframework/security/oauth2/server/authorization/config/annotation/web/configurers/OidcTests.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import java.net.URLEncoder;
2121
import java.nio.charset.StandardCharsets;
2222
import java.security.Principal;
23+
import java.time.Clock;
2324
import java.util.Base64;
2425
import java.util.HashSet;
2526
import java.util.List;
@@ -719,7 +720,7 @@ SecurityFilterChain authorizationServerSecurityFilterChain(HttpSecurity http) th
719720

720721
@Bean
721722
OAuth2TokenGenerator<?> tokenGenerator() {
722-
JwtGenerator jwtGenerator = new JwtGenerator(new NimbusJwtEncoder(jwkSource()));
723+
JwtGenerator jwtGenerator = new JwtGenerator(new NimbusJwtEncoder(jwkSource()), Clock.systemUTC());
723724
jwtGenerator.setJwtCustomizer(jwtCustomizer());
724725
OAuth2RefreshTokenGenerator refreshTokenGenerator = new OAuth2RefreshTokenGenerator();
725726
OAuth2TokenGenerator<OAuth2Token> delegatingTokenGenerator = new DelegatingOAuth2TokenGenerator(
@@ -760,7 +761,7 @@ SecurityFilterChain authorizationServerSecurityFilterChain(HttpSecurity http) th
760761

761762
@Bean
762763
OAuth2TokenGenerator<?> tokenGenerator() {
763-
JwtGenerator jwtGenerator = new JwtGenerator(new NimbusJwtEncoder(jwkSource()));
764+
JwtGenerator jwtGenerator = new JwtGenerator(new NimbusJwtEncoder(jwkSource()), Clock.systemUTC());
764765
jwtGenerator.setJwtCustomizer(jwtCustomizer());
765766
OAuth2TokenGenerator<OAuth2RefreshToken> refreshTokenGenerator = new CustomRefreshTokenGenerator();
766767
return new DelegatingOAuth2TokenGenerator(jwtGenerator, refreshTokenGenerator);

oauth2-authorization-server/src/test/java/org/springframework/security/oauth2/server/authorization/oidc/authentication/OidcClientRegistrationAuthenticationProviderTests.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
*/
1616
package org.springframework.security.oauth2.server.authorization.oidc.authentication;
1717

18+
import java.time.Clock;
1819
import java.util.ArrayList;
1920
import java.util.Arrays;
2021
import java.util.Collections;
@@ -107,7 +108,7 @@ public void setUp() {
107108
this.registeredClientRepository = mock(RegisteredClientRepository.class);
108109
this.authorizationService = mock(OAuth2AuthorizationService.class);
109110
this.jwtEncoder = mock(JwtEncoder.class);
110-
JwtGenerator jwtGenerator = new JwtGenerator(this.jwtEncoder);
111+
JwtGenerator jwtGenerator = new JwtGenerator(this.jwtEncoder, Clock.systemUTC());
111112
this.tokenGenerator = spy(new OAuth2TokenGenerator<Jwt>() {
112113
@Override
113114
public Jwt generate(OAuth2TokenContext context) {

oauth2-authorization-server/src/test/java/org/springframework/security/oauth2/server/authorization/token/JwtGeneratorTests.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
package org.springframework.security.oauth2.server.authorization.token;
1717

1818
import java.security.Principal;
19+
import java.time.Clock;
1920
import java.time.Instant;
2021
import java.time.temporal.ChronoUnit;
2122
import java.util.Date;
@@ -82,7 +83,7 @@ public class JwtGeneratorTests {
8283
public void setUp() {
8384
this.jwtEncoder = mock(JwtEncoder.class);
8485
this.jwtCustomizer = mock(OAuth2TokenCustomizer.class);
85-
this.jwtGenerator = new JwtGenerator(this.jwtEncoder);
86+
this.jwtGenerator = new JwtGenerator(this.jwtEncoder, Clock.systemUTC());
8687
this.jwtGenerator.setJwtCustomizer(this.jwtCustomizer);
8788
AuthorizationServerSettings authorizationServerSettings = AuthorizationServerSettings.builder()
8889
.issuer("https://provider.com")
@@ -92,10 +93,16 @@ public void setUp() {
9293

9394
@Test
9495
public void constructorWhenJwtEncoderNullThenThrowIllegalArgumentException() {
95-
assertThatThrownBy(() -> new JwtGenerator(null)).isInstanceOf(IllegalArgumentException.class)
96+
assertThatThrownBy(() -> new JwtGenerator(null, Clock.systemUTC())).isInstanceOf(IllegalArgumentException.class)
9697
.hasMessage("jwtEncoder cannot be null");
9798
}
9899

100+
@Test
101+
public void constructorWhenClockNullThenThrowIllegalArgumentException() {
102+
assertThatThrownBy(() -> new JwtGenerator(this.jwtEncoder, null)).isInstanceOf(IllegalArgumentException.class)
103+
.hasMessage("clock cannot be null");
104+
}
105+
99106
@Test
100107
public void setJwtCustomizerWhenNullThenThrowIllegalArgumentException() {
101108
assertThatThrownBy(() -> this.jwtGenerator.setJwtCustomizer(null)).isInstanceOf(IllegalArgumentException.class)

0 commit comments

Comments
 (0)