Skip to content

Commit a89015c

Browse files
authored
#691 OAuth2TokenProvider should allow dynamic systemTime (#693)
* #691 `OAuth2TokenProvider` should allow dynamic `systemTime` * #691 implement test for timeProvider
1 parent 69fc64e commit a89015c

File tree

2 files changed

+80
-3
lines changed

2 files changed

+80
-3
lines changed

src/main/kotlin/no/nav/security/mock/oauth2/token/OAuth2TokenProvider.kt

+12-1
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,23 @@ import java.time.Instant
1919
import java.util.Date
2020
import java.util.UUID
2121

22+
typealias TimeProvider = () -> Instant?
23+
2224
class OAuth2TokenProvider
2325
@JvmOverloads
2426
constructor(
2527
private val keyProvider: KeyProvider = KeyProvider(),
26-
val systemTime: Instant? = null,
28+
private val timeProvider: TimeProvider,
2729
) {
30+
val systemTime
31+
get() = timeProvider()
32+
33+
@JvmOverloads
34+
constructor(
35+
keyProvider: KeyProvider = KeyProvider(),
36+
systemTime: Instant? = null,
37+
) : this(keyProvider, { systemTime })
38+
2839
@JvmOverloads
2940
fun publicJwkSet(issuerId: String = "default"): JWKSet {
3041
return JWKSet(keyProvider.signingKey(issuerId)).toPublicJWKSet()

src/test/kotlin/no/nav/security/mock/oauth2/token/OAuth2TokenProviderRSATest.kt

+68-2
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,9 @@ import okhttp3.HttpUrl.Companion.toHttpUrl
1616
import org.junit.jupiter.api.Test
1717
import org.junit.jupiter.params.ParameterizedTest
1818
import org.junit.jupiter.params.provider.ValueSource
19+
import java.time.Clock
1920
import java.time.Instant
21+
import java.time.ZoneId
2022
import java.time.temporal.ChronoUnit
2123
import java.util.Date
2224

@@ -99,8 +101,8 @@ internal class OAuth2TokenProviderRSATest {
99101

100102
@Test
101103
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)
104106

105107
tokenProvider.exchangeAccessToken(
106108
tokenRequest =
@@ -118,6 +120,70 @@ internal class OAuth2TokenProviderRSATest {
118120
}
119121
}
120122

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+
121187
private fun idToken(issuerUrl: String): SignedJWT =
122188
tokenProvider.idToken(
123189
tokenRequest =

0 commit comments

Comments
 (0)