|
31 | 31 | import org.springframework.security.core.session.SessionInformation; |
32 | 32 | import org.springframework.security.oauth2.core.AuthorizationGrantType; |
33 | 33 | import org.springframework.security.oauth2.core.ClientAuthenticationMethod; |
| 34 | +import org.springframework.security.oauth2.core.OAuth2RefreshToken; |
34 | 35 | import org.springframework.security.oauth2.core.endpoint.OAuth2AuthorizationRequest; |
35 | 36 | import org.springframework.security.oauth2.core.endpoint.OAuth2ParameterNames; |
36 | 37 | import org.springframework.security.oauth2.core.oidc.IdTokenClaimNames; |
| 38 | +import org.springframework.security.oauth2.core.oidc.OidcIdToken; |
37 | 39 | import org.springframework.security.oauth2.core.oidc.OidcScopes; |
38 | 40 | import org.springframework.security.oauth2.core.oidc.endpoint.OidcParameterNames; |
39 | 41 | import org.springframework.security.oauth2.jose.jws.SignatureAlgorithm; |
|
46 | 48 | import org.springframework.security.oauth2.server.authorization.TestOAuth2Authorizations; |
47 | 49 | import org.springframework.security.oauth2.server.authorization.authentication.OAuth2AuthorizationCodeAuthenticationToken; |
48 | 50 | import org.springframework.security.oauth2.server.authorization.authentication.OAuth2ClientAuthenticationToken; |
| 51 | +import org.springframework.security.oauth2.server.authorization.authentication.OAuth2RefreshTokenAuthenticationToken; |
49 | 52 | import org.springframework.security.oauth2.server.authorization.client.RegisteredClient; |
50 | 53 | import org.springframework.security.oauth2.server.authorization.client.TestRegisteredClients; |
51 | 54 | import org.springframework.security.oauth2.server.authorization.context.TestAuthorizationServerContext; |
@@ -152,7 +155,7 @@ public void generateWhenAccessTokenTypeThenReturnJwt() { |
152 | 155 | } |
153 | 156 |
|
154 | 157 | @Test |
155 | | - public void generateWhenIdTokenTypeThenReturnJwt() { |
| 158 | + public void generateWhenIdTokenTypeAndAuthorizationCodeGrantThenReturnJwt() { |
156 | 159 | RegisteredClient registeredClient = TestRegisteredClients.registeredClient() |
157 | 160 | .scope(OidcScopes.OPENID) |
158 | 161 | .tokenSettings(TokenSettings.builder().idTokenSignatureAlgorithm(SignatureAlgorithm.ES256).build()) |
@@ -190,6 +193,49 @@ public void generateWhenIdTokenTypeThenReturnJwt() { |
190 | 193 | assertGeneratedTokenType(tokenContext); |
191 | 194 | } |
192 | 195 |
|
| 196 | + // gh-1224 |
| 197 | + @Test |
| 198 | + public void generateWhenIdTokenTypeAndRefreshTokenGrantThenReturnJwt() { |
| 199 | + RegisteredClient registeredClient = TestRegisteredClients.registeredClient() |
| 200 | + .scope(OidcScopes.OPENID) |
| 201 | + .build(); |
| 202 | + OidcIdToken idToken = OidcIdToken.withTokenValue("id-token") |
| 203 | + .issuer("https://provider.com") |
| 204 | + .subject("subject") |
| 205 | + .issuedAt(Instant.now()) |
| 206 | + .expiresAt(Instant.now().plusSeconds(60)) |
| 207 | + .claim("sid", "sessionId-1234") |
| 208 | + .claim(IdTokenClaimNames.AUTH_TIME, Date.from(Instant.now())) |
| 209 | + .build(); |
| 210 | + OAuth2Authorization authorization = TestOAuth2Authorizations.authorization(registeredClient) |
| 211 | + .token(idToken) |
| 212 | + .build(); |
| 213 | + |
| 214 | + OAuth2RefreshToken refreshToken = authorization.getRefreshToken().getToken(); |
| 215 | + OAuth2ClientAuthenticationToken clientPrincipal = new OAuth2ClientAuthenticationToken( |
| 216 | + registeredClient, ClientAuthenticationMethod.CLIENT_SECRET_BASIC, registeredClient.getClientSecret()); |
| 217 | + |
| 218 | + OAuth2RefreshTokenAuthenticationToken authentication = new OAuth2RefreshTokenAuthenticationToken( |
| 219 | + refreshToken.getTokenValue(), clientPrincipal, null, null); |
| 220 | + |
| 221 | + Authentication principal = authorization.getAttribute(Principal.class.getName()); |
| 222 | + |
| 223 | + // @formatter:off |
| 224 | + OAuth2TokenContext tokenContext = DefaultOAuth2TokenContext.builder() |
| 225 | + .registeredClient(registeredClient) |
| 226 | + .principal(principal) |
| 227 | + .authorizationServerContext(this.authorizationServerContext) |
| 228 | + .authorization(authorization) |
| 229 | + .authorizedScopes(authorization.getAuthorizedScopes()) |
| 230 | + .tokenType(ID_TOKEN_TOKEN_TYPE) |
| 231 | + .authorizationGrantType(AuthorizationGrantType.REFRESH_TOKEN) |
| 232 | + .authorizationGrant(authentication) |
| 233 | + .build(); |
| 234 | + // @formatter:on |
| 235 | + |
| 236 | + assertGeneratedTokenType(tokenContext); |
| 237 | + } |
| 238 | + |
193 | 239 | private void assertGeneratedTokenType(OAuth2TokenContext tokenContext) { |
194 | 240 | this.jwtGenerator.generate(tokenContext); |
195 | 241 |
|
@@ -239,15 +285,20 @@ private void assertGeneratedTokenType(OAuth2TokenContext tokenContext) { |
239 | 285 | assertThat(scopes).isEqualTo(tokenContext.getAuthorizedScopes()); |
240 | 286 | } else { |
241 | 287 | assertThat(jwtClaimsSet.<String>getClaim(IdTokenClaimNames.AZP)).isEqualTo(tokenContext.getRegisteredClient().getClientId()); |
242 | | - |
243 | | - OAuth2AuthorizationRequest authorizationRequest = tokenContext.getAuthorization().getAttribute( |
244 | | - OAuth2AuthorizationRequest.class.getName()); |
245 | | - String nonce = (String) authorizationRequest.getAdditionalParameters().get(OidcParameterNames.NONCE); |
246 | | - assertThat(jwtClaimsSet.<String>getClaim(IdTokenClaimNames.NONCE)).isEqualTo(nonce); |
247 | | - |
248 | | - SessionInformation sessionInformation = tokenContext.get(SessionInformation.class); |
249 | | - assertThat(jwtClaimsSet.<String>getClaim("sid")).isEqualTo(sessionInformation.getSessionId()); |
250 | | - assertThat(jwtClaimsSet.<Date>getClaim(IdTokenClaimNames.AUTH_TIME)).isEqualTo(sessionInformation.getLastRequest()); |
| 288 | + if (tokenContext.getAuthorizationGrantType().equals(AuthorizationGrantType.AUTHORIZATION_CODE)) { |
| 289 | + OAuth2AuthorizationRequest authorizationRequest = tokenContext.getAuthorization().getAttribute( |
| 290 | + OAuth2AuthorizationRequest.class.getName()); |
| 291 | + String nonce = (String) authorizationRequest.getAdditionalParameters().get(OidcParameterNames.NONCE); |
| 292 | + assertThat(jwtClaimsSet.<String>getClaim(IdTokenClaimNames.NONCE)).isEqualTo(nonce); |
| 293 | + |
| 294 | + SessionInformation sessionInformation = tokenContext.get(SessionInformation.class); |
| 295 | + assertThat(jwtClaimsSet.<String>getClaim("sid")).isEqualTo(sessionInformation.getSessionId()); |
| 296 | + assertThat(jwtClaimsSet.<Date>getClaim(IdTokenClaimNames.AUTH_TIME)).isEqualTo(sessionInformation.getLastRequest()); |
| 297 | + } else if (tokenContext.getAuthorizationGrantType().equals(AuthorizationGrantType.REFRESH_TOKEN)) { |
| 298 | + OidcIdToken currentIdToken = tokenContext.getAuthorization().getToken(OidcIdToken.class).getToken(); |
| 299 | + assertThat(jwtClaimsSet.<String>getClaim("sid")).isEqualTo(currentIdToken.getClaim("sid")); |
| 300 | + assertThat(jwtClaimsSet.<Date>getClaim(IdTokenClaimNames.AUTH_TIME)).isEqualTo(currentIdToken.<Date>getClaim(IdTokenClaimNames.AUTH_TIME)); |
| 301 | + } |
251 | 302 | } |
252 | 303 | } |
253 | 304 |
|
|
0 commit comments