@@ -16,7 +16,9 @@ import okhttp3.HttpUrl.Companion.toHttpUrl
16
16
import org.junit.jupiter.api.Test
17
17
import org.junit.jupiter.params.ParameterizedTest
18
18
import org.junit.jupiter.params.provider.ValueSource
19
+ import java.time.Clock
19
20
import java.time.Instant
21
+ import java.time.ZoneId
20
22
import java.time.temporal.ChronoUnit
21
23
import java.util.Date
22
24
@@ -99,8 +101,8 @@ internal class OAuth2TokenProviderRSATest {
99
101
100
102
@Test
101
103
fun `token should have issuedAt set to systemTime if set, otherwise use now()` () {
102
- val yesterDay = Instant .now().minus(1 , ChronoUnit .DAYS )
103
- val tokenProvider = OAuth2TokenProvider (systemTime = yesterDay )
104
+ val yesterday = Instant .now().minus(1 , ChronoUnit .DAYS )
105
+ val tokenProvider = OAuth2TokenProvider (systemTime = yesterday )
104
106
105
107
tokenProvider.exchangeAccessToken(
106
108
tokenRequest =
@@ -118,6 +120,70 @@ internal class OAuth2TokenProviderRSATest {
118
120
}
119
121
}
120
122
123
+ @Test
124
+ fun `token should have issuedAt set dynamically according to timeProvider` () {
125
+ val clock =
126
+ object : Clock () {
127
+ private var clock = systemDefaultZone()
128
+
129
+ override fun instant () = clock.instant()
130
+
131
+ override fun withZone (zone : ZoneId ) = clock.withZone(zone)
132
+
133
+ override fun getZone () = clock.zone
134
+
135
+ fun fixed (instant : Instant ) {
136
+ clock = fixed(instant, zone)
137
+ }
138
+ }
139
+
140
+ val tokenProvider = OAuth2TokenProvider { clock.instant() }
141
+
142
+ val instant1 = Instant .parse(" 2000-12-03T10:15:30.00Z" )
143
+ val instant2 = Instant .parse(" 2020-01-21T00:00:00.00Z" )
144
+ instant1 shouldNotBe instant2
145
+
146
+ run {
147
+ clock.fixed(instant1)
148
+ tokenProvider.systemTime shouldBe instant1
149
+
150
+ tokenProvider.exchangeAccessToken(
151
+ tokenRequest =
152
+ nimbusTokenRequest(
153
+ " id" ,
154
+ " grant_type" to GrantType .CLIENT_CREDENTIALS .value,
155
+ " scope" to " scope1" ,
156
+ ),
157
+ issuerUrl = " http://default_if_not_overridden" .toHttpUrl(),
158
+ claimsSet = tokenProvider.jwt(mapOf ()).jwtClaimsSet,
159
+ oAuth2TokenCallback = DefaultOAuth2TokenCallback (),
160
+ )
161
+ }.asClue {
162
+ it.jwtClaimsSet.issueTime shouldBe Date .from(instant1)
163
+ println (it.serialize())
164
+ }
165
+
166
+ run {
167
+ clock.fixed(instant2)
168
+ tokenProvider.systemTime shouldBe instant2
169
+
170
+ tokenProvider.exchangeAccessToken(
171
+ tokenRequest =
172
+ nimbusTokenRequest(
173
+ " id" ,
174
+ " grant_type" to GrantType .CLIENT_CREDENTIALS .value,
175
+ " scope" to " scope1" ,
176
+ ),
177
+ issuerUrl = " http://default_if_not_overridden" .toHttpUrl(),
178
+ claimsSet = tokenProvider.jwt(mapOf ()).jwtClaimsSet,
179
+ oAuth2TokenCallback = DefaultOAuth2TokenCallback (),
180
+ )
181
+ }.asClue {
182
+ it.jwtClaimsSet.issueTime shouldBe Date .from(instant2)
183
+ println (it.serialize())
184
+ }
185
+ }
186
+
121
187
private fun idToken (issuerUrl : String ): SignedJWT =
122
188
tokenProvider.idToken(
123
189
tokenRequest =
0 commit comments