|
19 | 19 | import java.io.IOException; |
20 | 20 | import java.io.Serializable; |
21 | 21 | import java.lang.reflect.Field; |
| 22 | +import java.security.Principal; |
22 | 23 | import java.time.Instant; |
23 | 24 | import java.util.Collection; |
24 | 25 | import java.util.Date; |
|
122 | 123 | import org.springframework.security.oauth2.client.oidc.session.TestOidcSessionInformations; |
123 | 124 | import org.springframework.security.oauth2.client.registration.ClientRegistration; |
124 | 125 | import org.springframework.security.oauth2.client.registration.TestClientRegistrations; |
| 126 | +import org.springframework.security.oauth2.core.AuthorizationGrantType; |
| 127 | +import org.springframework.security.oauth2.core.ClientAuthenticationMethod; |
125 | 128 | import org.springframework.security.oauth2.core.DefaultOAuth2AuthenticatedPrincipal; |
126 | 129 | import org.springframework.security.oauth2.core.OAuth2AccessToken; |
127 | 130 | import org.springframework.security.oauth2.core.OAuth2AuthenticatedPrincipal; |
|
156 | 159 | import org.springframework.security.oauth2.jwt.JwtException; |
157 | 160 | import org.springframework.security.oauth2.jwt.JwtValidationException; |
158 | 161 | import org.springframework.security.oauth2.jwt.TestJwts; |
| 162 | +import org.springframework.security.oauth2.server.authorization.OAuth2Authorization; |
| 163 | +import org.springframework.security.oauth2.server.authorization.OAuth2AuthorizationConsent; |
| 164 | +import org.springframework.security.oauth2.server.authorization.OAuth2AuthorizationServerMetadata; |
| 165 | +import org.springframework.security.oauth2.server.authorization.OAuth2TokenIntrospection; |
| 166 | +import org.springframework.security.oauth2.server.authorization.OAuth2TokenType; |
| 167 | +import org.springframework.security.oauth2.server.authorization.TestOAuth2Authorizations; |
| 168 | +import org.springframework.security.oauth2.server.authorization.authentication.OAuth2AccessTokenAuthenticationToken; |
| 169 | +import org.springframework.security.oauth2.server.authorization.authentication.OAuth2AuthorizationCodeRequestAuthenticationToken; |
| 170 | +import org.springframework.security.oauth2.server.authorization.authentication.OAuth2AuthorizationConsentAuthenticationToken; |
| 171 | +import org.springframework.security.oauth2.server.authorization.authentication.OAuth2AuthorizationGrantAuthenticationToken; |
| 172 | +import org.springframework.security.oauth2.server.authorization.authentication.OAuth2ClientAuthenticationToken; |
| 173 | +import org.springframework.security.oauth2.server.authorization.authentication.OAuth2DeviceAuthorizationConsentAuthenticationToken; |
| 174 | +import org.springframework.security.oauth2.server.authorization.authentication.OAuth2DeviceAuthorizationRequestAuthenticationToken; |
| 175 | +import org.springframework.security.oauth2.server.authorization.authentication.OAuth2DeviceVerificationAuthenticationToken; |
| 176 | +import org.springframework.security.oauth2.server.authorization.authentication.OAuth2PushedAuthorizationRequestAuthenticationToken; |
| 177 | +import org.springframework.security.oauth2.server.authorization.authentication.OAuth2TokenIntrospectionAuthenticationToken; |
| 178 | +import org.springframework.security.oauth2.server.authorization.authentication.OAuth2TokenRevocationAuthenticationToken; |
| 179 | +import org.springframework.security.oauth2.server.authorization.client.RegisteredClient; |
| 180 | +import org.springframework.security.oauth2.server.authorization.client.TestRegisteredClients; |
| 181 | +import org.springframework.security.oauth2.server.authorization.oidc.OidcClientRegistration; |
| 182 | +import org.springframework.security.oauth2.server.authorization.oidc.OidcProviderConfiguration; |
| 183 | +import org.springframework.security.oauth2.server.authorization.oidc.authentication.OidcClientRegistrationAuthenticationToken; |
| 184 | +import org.springframework.security.oauth2.server.authorization.oidc.authentication.OidcLogoutAuthenticationToken; |
| 185 | +import org.springframework.security.oauth2.server.authorization.oidc.authentication.OidcUserInfoAuthenticationToken; |
| 186 | +import org.springframework.security.oauth2.server.authorization.settings.AuthorizationServerSettings; |
| 187 | +import org.springframework.security.oauth2.server.authorization.settings.ClientSettings; |
| 188 | +import org.springframework.security.oauth2.server.authorization.settings.OAuth2TokenFormat; |
| 189 | +import org.springframework.security.oauth2.server.authorization.settings.TokenSettings; |
159 | 190 | import org.springframework.security.oauth2.server.resource.BearerTokenError; |
160 | 191 | import org.springframework.security.oauth2.server.resource.BearerTokenErrors; |
161 | 192 | import org.springframework.security.oauth2.server.resource.InvalidBearerTokenException; |
@@ -374,6 +405,146 @@ final class SerializationSamples { |
374 | 405 | generatorByClassName.put(DPoPAuthenticationToken.class, |
375 | 406 | (r) -> applyDetails(new DPoPAuthenticationToken("token", "proof", "method", "uri"))); |
376 | 407 |
|
| 408 | + // oauth2-authorization-server |
| 409 | + RegisteredClient registeredClient = TestRegisteredClients.registeredClient().build(); |
| 410 | + OAuth2Authorization authorization = TestOAuth2Authorizations.authorization(registeredClient).build(); |
| 411 | + OAuth2AuthorizationRequest authorizationRequest = authorization |
| 412 | + .getAttribute(OAuth2AuthorizationRequest.class.getName()); |
| 413 | + Authentication principal = authorization.getAttribute(Principal.class.getName()); |
| 414 | + generatorByClassName.put(RegisteredClient.class, (r) -> registeredClient); |
| 415 | + generatorByClassName.put(OAuth2Authorization.class, (r) -> authorization); |
| 416 | + generatorByClassName.put(OAuth2Authorization.Token.class, (r) -> authorization.getAccessToken()); |
| 417 | + generatorByClassName.put(OAuth2AuthorizationConsent.class, |
| 418 | + (r) -> OAuth2AuthorizationConsent.withId("registeredClientId", "principalName") |
| 419 | + .scope("scope1") |
| 420 | + .scope("scope2") |
| 421 | + .build()); |
| 422 | + generatorByClassName.put(OAuth2AuthorizationCodeRequestAuthenticationToken.class, (r) -> { |
| 423 | + OAuth2AuthorizationCodeRequestAuthenticationToken authenticationToken = new OAuth2AuthorizationCodeRequestAuthenticationToken( |
| 424 | + "authorizationUri", "clientId", principal, "redirectUri", "state", authorizationRequest.getScopes(), |
| 425 | + authorizationRequest.getAdditionalParameters()); |
| 426 | + authenticationToken.setDetails(details); |
| 427 | + return authenticationToken; |
| 428 | + }); |
| 429 | + generatorByClassName.put(OAuth2PushedAuthorizationRequestAuthenticationToken.class, (r) -> { |
| 430 | + OAuth2PushedAuthorizationRequestAuthenticationToken authenticationToken = new OAuth2PushedAuthorizationRequestAuthenticationToken( |
| 431 | + "authorizationUri", "clientId", principal, "redirectUri", "state", authorizationRequest.getScopes(), |
| 432 | + authorizationRequest.getAdditionalParameters()); |
| 433 | + authenticationToken.setDetails(details); |
| 434 | + return authenticationToken; |
| 435 | + }); |
| 436 | + generatorByClassName.put(OAuth2AuthorizationGrantAuthenticationToken.class, (r) -> { |
| 437 | + org.springframework.security.oauth2.server.authorization.authentication.OAuth2AuthorizationCodeAuthenticationToken authenticationToken = new org.springframework.security.oauth2.server.authorization.authentication.OAuth2AuthorizationCodeAuthenticationToken( |
| 438 | + "code", principal, "redirectUri", new HashMap<>()); |
| 439 | + authenticationToken.setDetails(details); |
| 440 | + return authenticationToken; |
| 441 | + }); |
| 442 | + generatorByClassName.put(OAuth2AuthorizationConsentAuthenticationToken.class, (r) -> { |
| 443 | + OAuth2AuthorizationConsentAuthenticationToken authenticationToken = new OAuth2AuthorizationConsentAuthenticationToken( |
| 444 | + "authorizationUri", "clientId", principal, "state", authorizationRequest.getScopes(), |
| 445 | + authorizationRequest.getAdditionalParameters()); |
| 446 | + authenticationToken.setDetails(details); |
| 447 | + return authenticationToken; |
| 448 | + }); |
| 449 | + generatorByClassName.put(OAuth2DeviceAuthorizationRequestAuthenticationToken.class, (r) -> { |
| 450 | + OAuth2DeviceAuthorizationRequestAuthenticationToken authenticationToken = new OAuth2DeviceAuthorizationRequestAuthenticationToken( |
| 451 | + principal, "authorizationUri", authorizationRequest.getScopes(), |
| 452 | + authorizationRequest.getAdditionalParameters()); |
| 453 | + authenticationToken.setDetails(details); |
| 454 | + return authenticationToken; |
| 455 | + }); |
| 456 | + generatorByClassName.put(OAuth2DeviceAuthorizationConsentAuthenticationToken.class, (r) -> { |
| 457 | + OAuth2DeviceAuthorizationConsentAuthenticationToken authenticationToken = new OAuth2DeviceAuthorizationConsentAuthenticationToken( |
| 458 | + "authorizationUri", "clientId", principal, "userCode", "state", authorizationRequest.getScopes(), |
| 459 | + authorizationRequest.getAdditionalParameters()); |
| 460 | + authenticationToken.setDetails(details); |
| 461 | + return authenticationToken; |
| 462 | + }); |
| 463 | + generatorByClassName.put(OAuth2DeviceVerificationAuthenticationToken.class, (r) -> { |
| 464 | + OAuth2DeviceVerificationAuthenticationToken authenticationToken = new OAuth2DeviceVerificationAuthenticationToken( |
| 465 | + principal, "userCode", new HashMap<>()); |
| 466 | + authenticationToken.setDetails(details); |
| 467 | + return authenticationToken; |
| 468 | + }); |
| 469 | + generatorByClassName.put(OAuth2TokenIntrospectionAuthenticationToken.class, (r) -> { |
| 470 | + OAuth2TokenIntrospectionAuthenticationToken authenticationToken = new OAuth2TokenIntrospectionAuthenticationToken( |
| 471 | + "token", principal, "tokenTypeHint", new HashMap<>()); |
| 472 | + authenticationToken.setDetails(details); |
| 473 | + return authenticationToken; |
| 474 | + }); |
| 475 | + generatorByClassName.put(OAuth2TokenRevocationAuthenticationToken.class, (r) -> { |
| 476 | + OAuth2TokenRevocationAuthenticationToken authenticationToken = new OAuth2TokenRevocationAuthenticationToken( |
| 477 | + "token", principal, "tokenTypeHint"); |
| 478 | + authenticationToken.setDetails(details); |
| 479 | + return authenticationToken; |
| 480 | + }); |
| 481 | + OidcClientRegistration oidcClientRegistration = OidcClientRegistration.builder() |
| 482 | + .grantType(AuthorizationGrantType.AUTHORIZATION_CODE.getValue()) |
| 483 | + .scope("scope1") |
| 484 | + .redirectUri("https://localhost/oauth2/callback") |
| 485 | + .build(); |
| 486 | + generatorByClassName.put(OidcClientRegistration.class, (r) -> oidcClientRegistration); |
| 487 | + generatorByClassName.put(OidcClientRegistrationAuthenticationToken.class, (r) -> { |
| 488 | + OidcClientRegistrationAuthenticationToken authenticationToken = new OidcClientRegistrationAuthenticationToken( |
| 489 | + principal, oidcClientRegistration); |
| 490 | + authenticationToken.setDetails(details); |
| 491 | + return authenticationToken; |
| 492 | + }); |
| 493 | + generatorByClassName.put(OidcUserInfoAuthenticationToken.class, (r) -> { |
| 494 | + OidcUserInfo userInfo = OidcUserInfo.builder().subject("subject").name("name").build(); |
| 495 | + OidcUserInfoAuthenticationToken authenticationToken = new OidcUserInfoAuthenticationToken(principal, |
| 496 | + userInfo); |
| 497 | + authenticationToken.setDetails(details); |
| 498 | + return authenticationToken; |
| 499 | + }); |
| 500 | + generatorByClassName.put(OidcLogoutAuthenticationToken.class, (r) -> { |
| 501 | + OidcIdToken idToken = OidcIdToken.withTokenValue("tokenValue") |
| 502 | + .issuedAt(Instant.now()) |
| 503 | + .expiresAt(Instant.now().plusSeconds(60)) |
| 504 | + .build(); |
| 505 | + OidcLogoutAuthenticationToken authenticationToken = new OidcLogoutAuthenticationToken(idToken, principal, |
| 506 | + "sessionId", "clientId", "postLogoutRedirectUri", "state"); |
| 507 | + authenticationToken.setDetails(details); |
| 508 | + return authenticationToken; |
| 509 | + }); |
| 510 | + generatorByClassName.put(OAuth2ClientAuthenticationToken.class, (r) -> { |
| 511 | + OAuth2ClientAuthenticationToken authenticationToken = new OAuth2ClientAuthenticationToken(registeredClient, |
| 512 | + ClientAuthenticationMethod.CLIENT_SECRET_BASIC, "credentials"); |
| 513 | + authenticationToken.setDetails(details); |
| 514 | + return authenticationToken; |
| 515 | + }); |
| 516 | + generatorByClassName.put(OAuth2TokenIntrospection.class, |
| 517 | + (r) -> OAuth2TokenIntrospection.builder().active(true).clientId("clientId").build()); |
| 518 | + generatorByClassName.put(OAuth2AccessTokenAuthenticationToken.class, (r) -> { |
| 519 | + OAuth2AccessTokenAuthenticationToken authenticationToken = new OAuth2AccessTokenAuthenticationToken( |
| 520 | + registeredClient, principal, authorization.getAccessToken().getToken()); |
| 521 | + authenticationToken.setDetails(details); |
| 522 | + return authenticationToken; |
| 523 | + }); |
| 524 | + generatorByClassName.put(OAuth2AuthorizationServerMetadata.class, |
| 525 | + (r) -> OAuth2AuthorizationServerMetadata.builder() |
| 526 | + .issuer("https://localhost") |
| 527 | + .authorizationEndpoint("https://localhost/oauth2/authorize") |
| 528 | + .tokenEndpoint("https://localhost/oauth2/token") |
| 529 | + .responseType("code") |
| 530 | + .build()); |
| 531 | + generatorByClassName.put(OidcProviderConfiguration.class, |
| 532 | + (r) -> OidcProviderConfiguration.builder() |
| 533 | + .issuer("https://localhost") |
| 534 | + .authorizationEndpoint("https://localhost/oauth2/authorize") |
| 535 | + .tokenEndpoint("https://localhost/oauth2/token") |
| 536 | + .jwkSetUrl("https://localhost/oauth2/jwks") |
| 537 | + .responseType("code") |
| 538 | + .subjectType("subjectType") |
| 539 | + .idTokenSigningAlgorithm("RS256") |
| 540 | + .build()); |
| 541 | + generatorByClassName.put(OAuth2TokenType.class, (r) -> OAuth2TokenType.ACCESS_TOKEN); |
| 542 | + generatorByClassName.put(OAuth2TokenFormat.class, (r) -> OAuth2TokenFormat.SELF_CONTAINED); |
| 543 | + generatorByClassName.put(AuthorizationServerSettings.class, |
| 544 | + (r) -> AuthorizationServerSettings.builder().build()); |
| 545 | + generatorByClassName.put(ClientSettings.class, (r) -> ClientSettings.builder().build()); |
| 546 | + generatorByClassName.put(TokenSettings.class, (r) -> TokenSettings.builder().build()); |
| 547 | + |
377 | 548 | // config |
378 | 549 | generatorByClassName.put(AlreadyBuiltException.class, (r) -> new AlreadyBuiltException("message")); |
379 | 550 |
|
|
0 commit comments