|
22 | 22 | import org.cloudfoundry.identity.uaa.oauth.token.CompositeToken;
|
23 | 23 | import org.cloudfoundry.identity.uaa.user.JdbcUaaUserDatabase;
|
24 | 24 | import org.cloudfoundry.identity.uaa.user.UaaUser;
|
| 25 | +import org.cloudfoundry.identity.uaa.util.TimeService; |
25 | 26 | import org.cloudfoundry.identity.uaa.util.UaaTokenUtils;
|
26 | 27 | import org.cloudfoundry.identity.uaa.zone.MultitenantClientServices;
|
27 | 28 | import org.joda.time.DateTime;
|
28 |
| -import org.junit.jupiter.api.AfterEach; |
29 |
| -import org.junit.jupiter.api.BeforeEach; |
30 |
| -import org.junit.jupiter.api.DisplayName; |
31 |
| -import org.junit.jupiter.api.Nested; |
32 |
| -import org.junit.jupiter.api.Test; |
| 29 | +import org.junit.jupiter.api.*; |
33 | 30 | import org.junit.jupiter.params.ParameterizedTest;
|
34 | 31 | import org.junit.jupiter.params.provider.Arguments;
|
35 | 32 | import org.junit.jupiter.params.provider.MethodSource;
|
@@ -481,6 +478,94 @@ void happyCase(List<String> amrs) {
|
481 | 478 | }
|
482 | 479 | }
|
483 | 480 |
|
| 481 | + @Nested |
| 482 | + @DisplayName("when the client was created with refresh_token_validity specified") |
| 483 | + @DefaultTestContext |
| 484 | + @TestPropertySource(properties = {"uaa.url=https://uaa.some.test.domain.com:555/uaa"}) |
| 485 | + @DirtiesContext |
| 486 | + class WhenRefreshTokenValidityIsSpecified { |
| 487 | + private RefreshTokenCreator refreshTokenCreator; |
| 488 | + private RefreshTokenRequestData refreshTokenRequestData; |
| 489 | + private UaaUser uaaUser; |
| 490 | + private TokenRequest tokenRequest; |
| 491 | + |
| 492 | + @Autowired |
| 493 | + private TokenEndpointBuilder tokenEndpointBuilder; |
| 494 | + @Autowired |
| 495 | + private TimeService timeService; |
| 496 | + @Autowired |
| 497 | + private KeyInfoService keyInfoService; |
| 498 | + |
| 499 | + @BeforeEach |
| 500 | + void init() { |
| 501 | + refreshTokenRequestData = new RefreshTokenRequestData( |
| 502 | + GRANT_TYPE_AUTHORIZATION_CODE, |
| 503 | + Sets.newHashSet("openid", "user_attributes"), |
| 504 | + null, |
| 505 | + "", |
| 506 | + Sets.newHashSet(""), |
| 507 | + "jku_test", |
| 508 | + false, |
| 509 | + new Date(), |
| 510 | + null, |
| 511 | + null |
| 512 | + ); |
| 513 | + uaaUser = jdbcUaaUserDatabase.retrieveUserByName("admin", "uaa"); |
| 514 | + tokenRequest = new TokenRequest(new HashMap<>(), "jku_test", |
| 515 | + Lists.newArrayList("openid", "user_attributes"), |
| 516 | + GRANT_TYPE_REFRESH_TOKEN); |
| 517 | + } |
| 518 | + |
| 519 | + @ParameterizedTest |
| 520 | + @ValueSource(ints = { 3600, 24*3600*15, Integer.MAX_VALUE }) |
| 521 | + void validExpClaim(int validitySeconds) { |
| 522 | + RefreshTokenCreator refreshTokenCreator = createRefreshTokenCreator( |
| 523 | + validitySeconds); |
| 524 | + CompositeExpiringOAuth2RefreshToken refreshToken = |
| 525 | + refreshTokenCreator.createRefreshToken(uaaUser, |
| 526 | + refreshTokenRequestData, null); |
| 527 | + Assertions.assertNotNull(refreshToken); |
| 528 | + |
| 529 | + OAuth2AccessToken accessToken = tokenServices.refreshAccessToken( |
| 530 | + refreshToken.getValue(), tokenRequest); |
| 531 | + Assertions.assertNotNull(accessToken); |
| 532 | + } |
| 533 | + |
| 534 | + @ParameterizedTest |
| 535 | + @ValueSource(ints = { -3600, Integer.MIN_VALUE }) |
| 536 | + void invalidExpClaim(int validitySeconds) { |
| 537 | + RefreshTokenCreator refreshTokenCreator = createRefreshTokenCreator( |
| 538 | + validitySeconds); |
| 539 | + CompositeExpiringOAuth2RefreshToken refreshToken = |
| 540 | + refreshTokenCreator.createRefreshToken(uaaUser, |
| 541 | + refreshTokenRequestData, null); |
| 542 | + Assertions.assertNotNull(refreshToken); |
| 543 | + |
| 544 | + // Verifying with generic Exception instead of specific type because |
| 545 | + // refreshAccessToken() throws an Exception of which type is |
| 546 | + // different from the one that is declared in its method signature |
| 547 | + Assertions.assertThrows(Exception.class, () -> |
| 548 | + tokenServices.refreshAccessToken(refreshToken.getValue(), |
| 549 | + tokenRequest)); |
| 550 | + } |
| 551 | + |
| 552 | + private RefreshTokenCreator createRefreshTokenCreator( |
| 553 | + int validitySeconds) { |
| 554 | + TokenValidityResolver tokenValidityResolver = |
| 555 | + new TokenValidityResolver( |
| 556 | + new ClientTokenValidity() { |
| 557 | + public Integer getValiditySeconds(String clientId) { |
| 558 | + return validitySeconds; |
| 559 | + } |
| 560 | + public Integer getZoneValiditySeconds() { |
| 561 | + return 2592000; |
| 562 | + } |
| 563 | + }, 2592000, timeService); |
| 564 | + return new RefreshTokenCreator(false, tokenValidityResolver, |
| 565 | + tokenEndpointBuilder, timeService, keyInfoService); |
| 566 | + } |
| 567 | + } |
| 568 | + |
484 | 569 | private OAuth2Authentication constructUserAuthenticationFromAuthzRequest(AuthorizationRequest authzRequest,
|
485 | 570 | String userId,
|
486 | 571 | String userOrigin,
|
|
0 commit comments