|
@@ -0,0 +1,498 @@
|
|
|
+/*
|
|
|
+ * Copyright 2020-2024 the original author or authors.
|
|
|
+ *
|
|
|
+ * Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
+ * you may not use this file except in compliance with the License.
|
|
|
+ * You may obtain a copy of the License at
|
|
|
+ *
|
|
|
+ * https://www.apache.org/licenses/LICENSE-2.0
|
|
|
+ *
|
|
|
+ * Unless required by applicable law or agreed to in writing, software
|
|
|
+ * distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
+ * See the License for the specific language governing permissions and
|
|
|
+ * limitations under the License.
|
|
|
+ */
|
|
|
+package sample.redis.service;
|
|
|
+
|
|
|
+import java.security.Principal;
|
|
|
+
|
|
|
+import sample.redis.entity.OAuth2AuthorizationCodeGrantAuthorization;
|
|
|
+import sample.redis.entity.OAuth2AuthorizationGrantAuthorization;
|
|
|
+import sample.redis.entity.OAuth2ClientCredentialsGrantAuthorization;
|
|
|
+import sample.redis.entity.OAuth2DeviceCodeGrantAuthorization;
|
|
|
+import sample.redis.entity.OAuth2RegisteredClient;
|
|
|
+import sample.redis.entity.OAuth2TokenExchangeGrantAuthorization;
|
|
|
+import sample.redis.entity.OAuth2UserConsent;
|
|
|
+import sample.redis.entity.OidcAuthorizationCodeGrantAuthorization;
|
|
|
+
|
|
|
+import org.springframework.security.oauth2.core.AuthorizationGrantType;
|
|
|
+import org.springframework.security.oauth2.core.OAuth2AccessToken;
|
|
|
+import org.springframework.security.oauth2.core.OAuth2DeviceCode;
|
|
|
+import org.springframework.security.oauth2.core.OAuth2RefreshToken;
|
|
|
+import org.springframework.security.oauth2.core.OAuth2UserCode;
|
|
|
+import org.springframework.security.oauth2.core.endpoint.OAuth2AuthorizationRequest;
|
|
|
+import org.springframework.security.oauth2.core.endpoint.OAuth2ParameterNames;
|
|
|
+import org.springframework.security.oauth2.core.oidc.OidcIdToken;
|
|
|
+import org.springframework.security.oauth2.core.oidc.OidcScopes;
|
|
|
+import org.springframework.security.oauth2.server.authorization.OAuth2Authorization;
|
|
|
+import org.springframework.security.oauth2.server.authorization.OAuth2AuthorizationCode;
|
|
|
+import org.springframework.security.oauth2.server.authorization.OAuth2AuthorizationConsent;
|
|
|
+import org.springframework.security.oauth2.server.authorization.client.RegisteredClient;
|
|
|
+import org.springframework.security.oauth2.server.authorization.settings.ClientSettings;
|
|
|
+import org.springframework.security.oauth2.server.authorization.settings.OAuth2TokenFormat;
|
|
|
+import org.springframework.security.oauth2.server.authorization.settings.TokenSettings;
|
|
|
+import org.springframework.util.CollectionUtils;
|
|
|
+import org.springframework.util.StringUtils;
|
|
|
+
|
|
|
+final class ModelMapper {
|
|
|
+
|
|
|
+ static OAuth2RegisteredClient convertOAuth2RegisteredClient(RegisteredClient registeredClient) {
|
|
|
+ OAuth2RegisteredClient.ClientSettings clientSettings = new OAuth2RegisteredClient.ClientSettings(
|
|
|
+ registeredClient.getClientSettings().isRequireProofKey(),
|
|
|
+ registeredClient.getClientSettings().isRequireAuthorizationConsent(),
|
|
|
+ registeredClient.getClientSettings().getJwkSetUrl(),
|
|
|
+ registeredClient.getClientSettings().getTokenEndpointAuthenticationSigningAlgorithm(),
|
|
|
+ registeredClient.getClientSettings().getX509CertificateSubjectDN());
|
|
|
+
|
|
|
+ OAuth2RegisteredClient.TokenSettings tokenSettings = new OAuth2RegisteredClient.TokenSettings(
|
|
|
+ registeredClient.getTokenSettings().getAuthorizationCodeTimeToLive(),
|
|
|
+ registeredClient.getTokenSettings().getAccessTokenTimeToLive(),
|
|
|
+ registeredClient.getTokenSettings().getAccessTokenFormat(),
|
|
|
+ registeredClient.getTokenSettings().getDeviceCodeTimeToLive(),
|
|
|
+ registeredClient.getTokenSettings().isReuseRefreshTokens(),
|
|
|
+ registeredClient.getTokenSettings().getRefreshTokenTimeToLive(),
|
|
|
+ registeredClient.getTokenSettings().getIdTokenSignatureAlgorithm(),
|
|
|
+ registeredClient.getTokenSettings().isX509CertificateBoundAccessTokens());
|
|
|
+
|
|
|
+ return new OAuth2RegisteredClient(registeredClient.getId(), registeredClient.getClientId(),
|
|
|
+ registeredClient.getClientIdIssuedAt(), registeredClient.getClientSecret(),
|
|
|
+ registeredClient.getClientSecretExpiresAt(), registeredClient.getClientName(),
|
|
|
+ registeredClient.getClientAuthenticationMethods(), registeredClient.getAuthorizationGrantTypes(),
|
|
|
+ registeredClient.getRedirectUris(), registeredClient.getPostLogoutRedirectUris(),
|
|
|
+ registeredClient.getScopes(), clientSettings, tokenSettings);
|
|
|
+ }
|
|
|
+
|
|
|
+ static OAuth2UserConsent convertOAuth2UserConsent(OAuth2AuthorizationConsent authorizationConsent) {
|
|
|
+ String id = authorizationConsent.getRegisteredClientId()
|
|
|
+ .concat("-")
|
|
|
+ .concat(authorizationConsent.getPrincipalName());
|
|
|
+ return new OAuth2UserConsent(id, authorizationConsent.getRegisteredClientId(),
|
|
|
+ authorizationConsent.getPrincipalName(), authorizationConsent.getAuthorities());
|
|
|
+ }
|
|
|
+
|
|
|
+ static OAuth2AuthorizationGrantAuthorization convertOAuth2AuthorizationGrantAuthorization(
|
|
|
+ OAuth2Authorization authorization) {
|
|
|
+
|
|
|
+ if (AuthorizationGrantType.AUTHORIZATION_CODE.equals(authorization.getAuthorizationGrantType())) {
|
|
|
+ OAuth2AuthorizationRequest authorizationRequest = authorization
|
|
|
+ .getAttribute(OAuth2AuthorizationRequest.class.getName());
|
|
|
+ return authorizationRequest.getScopes().contains(OidcScopes.OPENID)
|
|
|
+ ? convertOidcAuthorizationCodeGrantAuthorization(authorization)
|
|
|
+ : convertOAuth2AuthorizationCodeGrantAuthorization(authorization);
|
|
|
+ }
|
|
|
+ else if (AuthorizationGrantType.CLIENT_CREDENTIALS.equals(authorization.getAuthorizationGrantType())) {
|
|
|
+ return convertOAuth2ClientCredentialsGrantAuthorization(authorization);
|
|
|
+ }
|
|
|
+ else if (AuthorizationGrantType.DEVICE_CODE.equals(authorization.getAuthorizationGrantType())) {
|
|
|
+ return convertOAuth2DeviceCodeGrantAuthorization(authorization);
|
|
|
+ }
|
|
|
+ else if (AuthorizationGrantType.TOKEN_EXCHANGE.equals(authorization.getAuthorizationGrantType())) {
|
|
|
+ return convertOAuth2TokenExchangeGrantAuthorization(authorization);
|
|
|
+ }
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ static OidcAuthorizationCodeGrantAuthorization convertOidcAuthorizationCodeGrantAuthorization(
|
|
|
+ OAuth2Authorization authorization) {
|
|
|
+ OAuth2AuthorizationCodeGrantAuthorization.AuthorizationCode authorizationCode = extractAuthorizationCode(
|
|
|
+ authorization);
|
|
|
+ OAuth2AuthorizationGrantAuthorization.AccessToken accessToken = extractAccessToken(authorization);
|
|
|
+ OAuth2AuthorizationGrantAuthorization.RefreshToken refreshToken = extractRefreshToken(authorization);
|
|
|
+ OidcAuthorizationCodeGrantAuthorization.IdToken idToken = extractIdToken(authorization);
|
|
|
+
|
|
|
+ return new OidcAuthorizationCodeGrantAuthorization(authorization.getId(), authorization.getRegisteredClientId(),
|
|
|
+ authorization.getPrincipalName(), authorization.getAuthorizedScopes(), accessToken, refreshToken,
|
|
|
+ authorization.getAttribute(Principal.class.getName()),
|
|
|
+ authorization.getAttribute(OAuth2AuthorizationRequest.class.getName()), authorizationCode,
|
|
|
+ authorization.getAttribute(OAuth2ParameterNames.STATE), idToken);
|
|
|
+ }
|
|
|
+
|
|
|
+ static OAuth2AuthorizationCodeGrantAuthorization convertOAuth2AuthorizationCodeGrantAuthorization(
|
|
|
+ OAuth2Authorization authorization) {
|
|
|
+
|
|
|
+ OAuth2AuthorizationCodeGrantAuthorization.AuthorizationCode authorizationCode = extractAuthorizationCode(
|
|
|
+ authorization);
|
|
|
+ OAuth2AuthorizationGrantAuthorization.AccessToken accessToken = extractAccessToken(authorization);
|
|
|
+ OAuth2AuthorizationGrantAuthorization.RefreshToken refreshToken = extractRefreshToken(authorization);
|
|
|
+
|
|
|
+ return new OAuth2AuthorizationCodeGrantAuthorization(authorization.getId(),
|
|
|
+ authorization.getRegisteredClientId(), authorization.getPrincipalName(),
|
|
|
+ authorization.getAuthorizedScopes(), accessToken, refreshToken,
|
|
|
+ authorization.getAttribute(Principal.class.getName()),
|
|
|
+ authorization.getAttribute(OAuth2AuthorizationRequest.class.getName()), authorizationCode,
|
|
|
+ authorization.getAttribute(OAuth2ParameterNames.STATE));
|
|
|
+ }
|
|
|
+
|
|
|
+ static OAuth2ClientCredentialsGrantAuthorization convertOAuth2ClientCredentialsGrantAuthorization(
|
|
|
+ OAuth2Authorization authorization) {
|
|
|
+
|
|
|
+ OAuth2AuthorizationGrantAuthorization.AccessToken accessToken = extractAccessToken(authorization);
|
|
|
+
|
|
|
+ return new OAuth2ClientCredentialsGrantAuthorization(authorization.getId(),
|
|
|
+ authorization.getRegisteredClientId(), authorization.getPrincipalName(),
|
|
|
+ authorization.getAuthorizedScopes(), accessToken);
|
|
|
+ }
|
|
|
+
|
|
|
+ static OAuth2DeviceCodeGrantAuthorization convertOAuth2DeviceCodeGrantAuthorization(
|
|
|
+ OAuth2Authorization authorization) {
|
|
|
+
|
|
|
+ OAuth2AuthorizationGrantAuthorization.AccessToken accessToken = extractAccessToken(authorization);
|
|
|
+ OAuth2AuthorizationGrantAuthorization.RefreshToken refreshToken = extractRefreshToken(authorization);
|
|
|
+ OAuth2DeviceCodeGrantAuthorization.DeviceCode deviceCode = extractDeviceCode(authorization);
|
|
|
+ OAuth2DeviceCodeGrantAuthorization.UserCode userCode = extractUserCode(authorization);
|
|
|
+
|
|
|
+ return new OAuth2DeviceCodeGrantAuthorization(authorization.getId(), authorization.getRegisteredClientId(),
|
|
|
+ authorization.getPrincipalName(), authorization.getAuthorizedScopes(), accessToken, refreshToken,
|
|
|
+ authorization.getAttribute(Principal.class.getName()), deviceCode, userCode,
|
|
|
+ authorization.getAttribute(OAuth2ParameterNames.SCOPE),
|
|
|
+ authorization.getAttribute(OAuth2ParameterNames.STATE));
|
|
|
+ }
|
|
|
+
|
|
|
+ static OAuth2TokenExchangeGrantAuthorization convertOAuth2TokenExchangeGrantAuthorization(
|
|
|
+ OAuth2Authorization authorization) {
|
|
|
+
|
|
|
+ OAuth2AuthorizationGrantAuthorization.AccessToken accessToken = extractAccessToken(authorization);
|
|
|
+
|
|
|
+ return new OAuth2TokenExchangeGrantAuthorization(authorization.getId(), authorization.getRegisteredClientId(),
|
|
|
+ authorization.getPrincipalName(), authorization.getAuthorizedScopes(), accessToken);
|
|
|
+ }
|
|
|
+
|
|
|
+ static OAuth2AuthorizationCodeGrantAuthorization.AuthorizationCode extractAuthorizationCode(
|
|
|
+ OAuth2Authorization authorization) {
|
|
|
+ OAuth2AuthorizationCodeGrantAuthorization.AuthorizationCode authorizationCode = null;
|
|
|
+ if (authorization.getToken(OAuth2AuthorizationCode.class) != null) {
|
|
|
+ OAuth2Authorization.Token<OAuth2AuthorizationCode> oauth2AuthorizationCode = authorization
|
|
|
+ .getToken(OAuth2AuthorizationCode.class);
|
|
|
+ authorizationCode = new OAuth2AuthorizationCodeGrantAuthorization.AuthorizationCode(
|
|
|
+ oauth2AuthorizationCode.getToken().getTokenValue(),
|
|
|
+ oauth2AuthorizationCode.getToken().getIssuedAt(), oauth2AuthorizationCode.getToken().getExpiresAt(),
|
|
|
+ oauth2AuthorizationCode.isInvalidated());
|
|
|
+ }
|
|
|
+ return authorizationCode;
|
|
|
+ }
|
|
|
+
|
|
|
+ static OAuth2AuthorizationGrantAuthorization.AccessToken extractAccessToken(OAuth2Authorization authorization) {
|
|
|
+ OAuth2AuthorizationGrantAuthorization.AccessToken accessToken = null;
|
|
|
+ if (authorization.getAccessToken() != null) {
|
|
|
+ OAuth2Authorization.Token<OAuth2AccessToken> oauth2AccessToken = authorization.getAccessToken();
|
|
|
+ OAuth2TokenFormat tokenFormat = null;
|
|
|
+ if (OAuth2TokenFormat.SELF_CONTAINED.getValue()
|
|
|
+ .equals(oauth2AccessToken.getMetadata(OAuth2TokenFormat.class.getName()))) {
|
|
|
+ tokenFormat = OAuth2TokenFormat.SELF_CONTAINED;
|
|
|
+ }
|
|
|
+ else if (OAuth2TokenFormat.REFERENCE.getValue()
|
|
|
+ .equals(oauth2AccessToken.getMetadata(OAuth2TokenFormat.class.getName()))) {
|
|
|
+ tokenFormat = OAuth2TokenFormat.REFERENCE;
|
|
|
+ }
|
|
|
+ accessToken = new OAuth2AuthorizationGrantAuthorization.AccessToken(
|
|
|
+ oauth2AccessToken.getToken().getTokenValue(), oauth2AccessToken.getToken().getIssuedAt(),
|
|
|
+ oauth2AccessToken.getToken().getExpiresAt(), oauth2AccessToken.isInvalidated(),
|
|
|
+ oauth2AccessToken.getToken().getTokenType(), oauth2AccessToken.getToken().getScopes(), tokenFormat,
|
|
|
+ new OAuth2AuthorizationGrantAuthorization.ClaimsHolder(oauth2AccessToken.getClaims()));
|
|
|
+ }
|
|
|
+ return accessToken;
|
|
|
+ }
|
|
|
+
|
|
|
+ static OAuth2AuthorizationGrantAuthorization.RefreshToken extractRefreshToken(OAuth2Authorization authorization) {
|
|
|
+ OAuth2AuthorizationGrantAuthorization.RefreshToken refreshToken = null;
|
|
|
+ if (authorization.getRefreshToken() != null) {
|
|
|
+ OAuth2Authorization.Token<OAuth2RefreshToken> oauth2RefreshToken = authorization.getRefreshToken();
|
|
|
+ refreshToken = new OAuth2AuthorizationGrantAuthorization.RefreshToken(
|
|
|
+ oauth2RefreshToken.getToken().getTokenValue(), oauth2RefreshToken.getToken().getIssuedAt(),
|
|
|
+ oauth2RefreshToken.getToken().getExpiresAt(), oauth2RefreshToken.isInvalidated());
|
|
|
+ }
|
|
|
+ return refreshToken;
|
|
|
+ }
|
|
|
+
|
|
|
+ static OidcAuthorizationCodeGrantAuthorization.IdToken extractIdToken(OAuth2Authorization authorization) {
|
|
|
+ OidcAuthorizationCodeGrantAuthorization.IdToken idToken = null;
|
|
|
+ if (authorization.getToken(OidcIdToken.class) != null) {
|
|
|
+ OAuth2Authorization.Token<OidcIdToken> oidcIdToken = authorization.getToken(OidcIdToken.class);
|
|
|
+ idToken = new OidcAuthorizationCodeGrantAuthorization.IdToken(oidcIdToken.getToken().getTokenValue(),
|
|
|
+ oidcIdToken.getToken().getIssuedAt(), oidcIdToken.getToken().getExpiresAt(),
|
|
|
+ oidcIdToken.isInvalidated(),
|
|
|
+ new OAuth2AuthorizationGrantAuthorization.ClaimsHolder(oidcIdToken.getClaims()));
|
|
|
+ }
|
|
|
+ return idToken;
|
|
|
+ }
|
|
|
+
|
|
|
+ static OAuth2DeviceCodeGrantAuthorization.DeviceCode extractDeviceCode(OAuth2Authorization authorization) {
|
|
|
+ OAuth2DeviceCodeGrantAuthorization.DeviceCode deviceCode = null;
|
|
|
+ if (authorization.getToken(OAuth2DeviceCode.class) != null) {
|
|
|
+ OAuth2Authorization.Token<OAuth2DeviceCode> oauth2DeviceCode = authorization
|
|
|
+ .getToken(OAuth2DeviceCode.class);
|
|
|
+ deviceCode = new OAuth2DeviceCodeGrantAuthorization.DeviceCode(oauth2DeviceCode.getToken().getTokenValue(),
|
|
|
+ oauth2DeviceCode.getToken().getIssuedAt(), oauth2DeviceCode.getToken().getExpiresAt(),
|
|
|
+ oauth2DeviceCode.isInvalidated());
|
|
|
+ }
|
|
|
+ return deviceCode;
|
|
|
+ }
|
|
|
+
|
|
|
+ static OAuth2DeviceCodeGrantAuthorization.UserCode extractUserCode(OAuth2Authorization authorization) {
|
|
|
+ OAuth2DeviceCodeGrantAuthorization.UserCode userCode = null;
|
|
|
+ if (authorization.getToken(OAuth2UserCode.class) != null) {
|
|
|
+ OAuth2Authorization.Token<OAuth2UserCode> oauth2UserCode = authorization.getToken(OAuth2UserCode.class);
|
|
|
+ userCode = new OAuth2DeviceCodeGrantAuthorization.UserCode(oauth2UserCode.getToken().getTokenValue(),
|
|
|
+ oauth2UserCode.getToken().getIssuedAt(), oauth2UserCode.getToken().getExpiresAt(),
|
|
|
+ oauth2UserCode.isInvalidated());
|
|
|
+ }
|
|
|
+ return userCode;
|
|
|
+ }
|
|
|
+
|
|
|
+ static RegisteredClient convertRegisteredClient(OAuth2RegisteredClient oauth2RegisteredClient) {
|
|
|
+ ClientSettings.Builder clientSettingsBuilder = ClientSettings.builder()
|
|
|
+ .requireProofKey(oauth2RegisteredClient.getClientSettings().isRequireProofKey())
|
|
|
+ .requireAuthorizationConsent(oauth2RegisteredClient.getClientSettings().isRequireAuthorizationConsent());
|
|
|
+ if (StringUtils.hasText(oauth2RegisteredClient.getClientSettings().getJwkSetUrl())) {
|
|
|
+ clientSettingsBuilder.jwkSetUrl(oauth2RegisteredClient.getClientSettings().getJwkSetUrl());
|
|
|
+ }
|
|
|
+ if (oauth2RegisteredClient.getClientSettings().getTokenEndpointAuthenticationSigningAlgorithm() != null) {
|
|
|
+ clientSettingsBuilder.tokenEndpointAuthenticationSigningAlgorithm(
|
|
|
+ oauth2RegisteredClient.getClientSettings().getTokenEndpointAuthenticationSigningAlgorithm());
|
|
|
+ }
|
|
|
+ if (StringUtils.hasText(oauth2RegisteredClient.getClientSettings().getX509CertificateSubjectDN())) {
|
|
|
+ clientSettingsBuilder
|
|
|
+ .x509CertificateSubjectDN(oauth2RegisteredClient.getClientSettings().getX509CertificateSubjectDN());
|
|
|
+ }
|
|
|
+ ClientSettings clientSettings = clientSettingsBuilder.build();
|
|
|
+
|
|
|
+ TokenSettings.Builder tokenSettingsBuilder = TokenSettings.builder();
|
|
|
+ if (oauth2RegisteredClient.getTokenSettings().getAuthorizationCodeTimeToLive() != null) {
|
|
|
+ tokenSettingsBuilder.authorizationCodeTimeToLive(
|
|
|
+ oauth2RegisteredClient.getTokenSettings().getAuthorizationCodeTimeToLive());
|
|
|
+ }
|
|
|
+ if (oauth2RegisteredClient.getTokenSettings().getAccessTokenTimeToLive() != null) {
|
|
|
+ tokenSettingsBuilder
|
|
|
+ .accessTokenTimeToLive(oauth2RegisteredClient.getTokenSettings().getAccessTokenTimeToLive());
|
|
|
+ }
|
|
|
+ if (oauth2RegisteredClient.getTokenSettings().getAccessTokenFormat() != null) {
|
|
|
+ tokenSettingsBuilder.accessTokenFormat(oauth2RegisteredClient.getTokenSettings().getAccessTokenFormat());
|
|
|
+ }
|
|
|
+ if (oauth2RegisteredClient.getTokenSettings().getDeviceCodeTimeToLive() != null) {
|
|
|
+ tokenSettingsBuilder
|
|
|
+ .deviceCodeTimeToLive(oauth2RegisteredClient.getTokenSettings().getDeviceCodeTimeToLive());
|
|
|
+ }
|
|
|
+ tokenSettingsBuilder.reuseRefreshTokens(oauth2RegisteredClient.getTokenSettings().isReuseRefreshTokens());
|
|
|
+ if (oauth2RegisteredClient.getTokenSettings().getRefreshTokenTimeToLive() != null) {
|
|
|
+ tokenSettingsBuilder
|
|
|
+ .refreshTokenTimeToLive(oauth2RegisteredClient.getTokenSettings().getRefreshTokenTimeToLive());
|
|
|
+ }
|
|
|
+ if (oauth2RegisteredClient.getTokenSettings().getIdTokenSignatureAlgorithm() != null) {
|
|
|
+ tokenSettingsBuilder
|
|
|
+ .idTokenSignatureAlgorithm(oauth2RegisteredClient.getTokenSettings().getIdTokenSignatureAlgorithm());
|
|
|
+ }
|
|
|
+ tokenSettingsBuilder.x509CertificateBoundAccessTokens(
|
|
|
+ oauth2RegisteredClient.getTokenSettings().isX509CertificateBoundAccessTokens());
|
|
|
+ TokenSettings tokenSettings = tokenSettingsBuilder.build();
|
|
|
+
|
|
|
+ RegisteredClient.Builder registeredClientBuilder = RegisteredClient.withId(oauth2RegisteredClient.getId())
|
|
|
+ .clientId(oauth2RegisteredClient.getClientId())
|
|
|
+ .clientIdIssuedAt(oauth2RegisteredClient.getClientIdIssuedAt())
|
|
|
+ .clientSecret(oauth2RegisteredClient.getClientSecret())
|
|
|
+ .clientSecretExpiresAt(oauth2RegisteredClient.getClientSecretExpiresAt())
|
|
|
+ .clientName(oauth2RegisteredClient.getClientName())
|
|
|
+ .clientAuthenticationMethods((clientAuthenticationMethods) -> clientAuthenticationMethods
|
|
|
+ .addAll(oauth2RegisteredClient.getClientAuthenticationMethods()))
|
|
|
+ .authorizationGrantTypes((authorizationGrantTypes) -> authorizationGrantTypes
|
|
|
+ .addAll(oauth2RegisteredClient.getAuthorizationGrantTypes()))
|
|
|
+ .clientSettings(clientSettings)
|
|
|
+ .tokenSettings(tokenSettings);
|
|
|
+ if (!CollectionUtils.isEmpty(oauth2RegisteredClient.getRedirectUris())) {
|
|
|
+ registeredClientBuilder.redirectUris((redirectUris) -> redirectUris.addAll(oauth2RegisteredClient.getRedirectUris()));
|
|
|
+ }
|
|
|
+ if (!CollectionUtils.isEmpty(oauth2RegisteredClient.getPostLogoutRedirectUris())) {
|
|
|
+ registeredClientBuilder.postLogoutRedirectUris((postLogoutRedirectUris) ->
|
|
|
+ postLogoutRedirectUris.addAll(oauth2RegisteredClient.getPostLogoutRedirectUris()));
|
|
|
+ }
|
|
|
+ if (!CollectionUtils.isEmpty(oauth2RegisteredClient.getScopes())) {
|
|
|
+ registeredClientBuilder.scopes((scopes) -> scopes.addAll(oauth2RegisteredClient.getScopes()));
|
|
|
+ }
|
|
|
+
|
|
|
+ return registeredClientBuilder.build();
|
|
|
+ }
|
|
|
+
|
|
|
+ static OAuth2AuthorizationConsent convertOAuth2AuthorizationConsent(OAuth2UserConsent userConsent) {
|
|
|
+ return OAuth2AuthorizationConsent.withId(userConsent.getRegisteredClientId(), userConsent.getPrincipalName())
|
|
|
+ .authorities((authorities) -> authorities.addAll(userConsent.getAuthorities()))
|
|
|
+ .build();
|
|
|
+ }
|
|
|
+
|
|
|
+ static void mapOAuth2AuthorizationGrantAuthorization(
|
|
|
+ OAuth2AuthorizationGrantAuthorization authorizationGrantAuthorization,
|
|
|
+ OAuth2Authorization.Builder builder) {
|
|
|
+
|
|
|
+ if (authorizationGrantAuthorization instanceof OidcAuthorizationCodeGrantAuthorization authorizationGrant) {
|
|
|
+ mapOidcAuthorizationCodeGrantAuthorization(authorizationGrant, builder);
|
|
|
+ }
|
|
|
+ else if (authorizationGrantAuthorization instanceof OAuth2AuthorizationCodeGrantAuthorization authorizationGrant) {
|
|
|
+ mapOAuth2AuthorizationCodeGrantAuthorization(authorizationGrant, builder);
|
|
|
+ }
|
|
|
+ else if (authorizationGrantAuthorization instanceof OAuth2ClientCredentialsGrantAuthorization authorizationGrant) {
|
|
|
+ mapOAuth2ClientCredentialsGrantAuthorization(authorizationGrant, builder);
|
|
|
+ }
|
|
|
+ else if (authorizationGrantAuthorization instanceof OAuth2DeviceCodeGrantAuthorization authorizationGrant) {
|
|
|
+ mapOAuth2DeviceCodeGrantAuthorization(authorizationGrant, builder);
|
|
|
+ }
|
|
|
+ else if (authorizationGrantAuthorization instanceof OAuth2TokenExchangeGrantAuthorization authorizationGrant) {
|
|
|
+ mapOAuth2TokenExchangeGrantAuthorization(authorizationGrant, builder);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ static void mapOidcAuthorizationCodeGrantAuthorization(
|
|
|
+ OidcAuthorizationCodeGrantAuthorization authorizationCodeGrantAuthorization,
|
|
|
+ OAuth2Authorization.Builder builder) {
|
|
|
+
|
|
|
+ mapOAuth2AuthorizationCodeGrantAuthorization(authorizationCodeGrantAuthorization, builder);
|
|
|
+ mapIdToken(authorizationCodeGrantAuthorization.getIdToken(), builder);
|
|
|
+ }
|
|
|
+
|
|
|
+ static void mapOAuth2AuthorizationCodeGrantAuthorization(
|
|
|
+ OAuth2AuthorizationCodeGrantAuthorization authorizationCodeGrantAuthorization,
|
|
|
+ OAuth2Authorization.Builder builder) {
|
|
|
+
|
|
|
+ builder.id(authorizationCodeGrantAuthorization.getId())
|
|
|
+ .principalName(authorizationCodeGrantAuthorization.getPrincipalName())
|
|
|
+ .authorizationGrantType(AuthorizationGrantType.AUTHORIZATION_CODE)
|
|
|
+ .authorizedScopes(authorizationCodeGrantAuthorization.getAuthorizedScopes())
|
|
|
+ .attribute(Principal.class.getName(), authorizationCodeGrantAuthorization.getPrincipal())
|
|
|
+ .attribute(OAuth2AuthorizationRequest.class.getName(),
|
|
|
+ authorizationCodeGrantAuthorization.getAuthorizationRequest());
|
|
|
+ if (StringUtils.hasText(authorizationCodeGrantAuthorization.getState())) {
|
|
|
+ builder.attribute(OAuth2ParameterNames.STATE, authorizationCodeGrantAuthorization.getState());
|
|
|
+ }
|
|
|
+
|
|
|
+ mapAuthorizationCode(authorizationCodeGrantAuthorization.getAuthorizationCode(), builder);
|
|
|
+ mapAccessToken(authorizationCodeGrantAuthorization.getAccessToken(), builder);
|
|
|
+ mapRefreshToken(authorizationCodeGrantAuthorization.getRefreshToken(), builder);
|
|
|
+ }
|
|
|
+
|
|
|
+ static void mapOAuth2ClientCredentialsGrantAuthorization(
|
|
|
+ OAuth2ClientCredentialsGrantAuthorization clientCredentialsGrantAuthorization,
|
|
|
+ OAuth2Authorization.Builder builder) {
|
|
|
+
|
|
|
+ builder.id(clientCredentialsGrantAuthorization.getId())
|
|
|
+ .principalName(clientCredentialsGrantAuthorization.getPrincipalName())
|
|
|
+ .authorizationGrantType(AuthorizationGrantType.CLIENT_CREDENTIALS)
|
|
|
+ .authorizedScopes(clientCredentialsGrantAuthorization.getAuthorizedScopes());
|
|
|
+
|
|
|
+ mapAccessToken(clientCredentialsGrantAuthorization.getAccessToken(), builder);
|
|
|
+ }
|
|
|
+
|
|
|
+ static void mapOAuth2DeviceCodeGrantAuthorization(OAuth2DeviceCodeGrantAuthorization deviceCodeGrantAuthorization,
|
|
|
+ OAuth2Authorization.Builder builder) {
|
|
|
+
|
|
|
+ builder.id(deviceCodeGrantAuthorization.getId())
|
|
|
+ .principalName(deviceCodeGrantAuthorization.getPrincipalName())
|
|
|
+ .authorizationGrantType(AuthorizationGrantType.DEVICE_CODE)
|
|
|
+ .authorizedScopes(deviceCodeGrantAuthorization.getAuthorizedScopes());
|
|
|
+ if (deviceCodeGrantAuthorization.getPrincipal() != null) {
|
|
|
+ builder.attribute(Principal.class.getName(), deviceCodeGrantAuthorization.getPrincipal());
|
|
|
+ }
|
|
|
+ if (deviceCodeGrantAuthorization.getRequestedScopes() != null) {
|
|
|
+ builder.attribute(OAuth2ParameterNames.SCOPE, deviceCodeGrantAuthorization.getRequestedScopes());
|
|
|
+ }
|
|
|
+ if (StringUtils.hasText(deviceCodeGrantAuthorization.getDeviceState())) {
|
|
|
+ builder.attribute(OAuth2ParameterNames.STATE, deviceCodeGrantAuthorization.getDeviceState());
|
|
|
+ }
|
|
|
+
|
|
|
+ mapAccessToken(deviceCodeGrantAuthorization.getAccessToken(), builder);
|
|
|
+ mapRefreshToken(deviceCodeGrantAuthorization.getRefreshToken(), builder);
|
|
|
+ mapDeviceCode(deviceCodeGrantAuthorization.getDeviceCode(), builder);
|
|
|
+ mapUserCode(deviceCodeGrantAuthorization.getUserCode(), builder);
|
|
|
+ }
|
|
|
+
|
|
|
+ static void mapOAuth2TokenExchangeGrantAuthorization(
|
|
|
+ OAuth2TokenExchangeGrantAuthorization tokenExchangeGrantAuthorization,
|
|
|
+ OAuth2Authorization.Builder builder) {
|
|
|
+
|
|
|
+ builder.id(tokenExchangeGrantAuthorization.getId())
|
|
|
+ .principalName(tokenExchangeGrantAuthorization.getPrincipalName())
|
|
|
+ .authorizationGrantType(AuthorizationGrantType.TOKEN_EXCHANGE)
|
|
|
+ .authorizedScopes(tokenExchangeGrantAuthorization.getAuthorizedScopes());
|
|
|
+
|
|
|
+ mapAccessToken(tokenExchangeGrantAuthorization.getAccessToken(), builder);
|
|
|
+ }
|
|
|
+
|
|
|
+ static void mapAuthorizationCode(OAuth2AuthorizationCodeGrantAuthorization.AuthorizationCode authorizationCode,
|
|
|
+ OAuth2Authorization.Builder builder) {
|
|
|
+ if (authorizationCode == null) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ OAuth2AuthorizationCode oauth2AuthorizationCode = new OAuth2AuthorizationCode(authorizationCode.getTokenValue(),
|
|
|
+ authorizationCode.getIssuedAt(), authorizationCode.getExpiresAt());
|
|
|
+ builder.token(oauth2AuthorizationCode, (metadata) -> metadata
|
|
|
+ .put(OAuth2Authorization.Token.INVALIDATED_METADATA_NAME, authorizationCode.isInvalidated()));
|
|
|
+ }
|
|
|
+
|
|
|
+ static void mapAccessToken(OAuth2AuthorizationGrantAuthorization.AccessToken accessToken,
|
|
|
+ OAuth2Authorization.Builder builder) {
|
|
|
+ if (accessToken == null) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ OAuth2AccessToken oauth2AccessToken = new OAuth2AccessToken(accessToken.getTokenType(),
|
|
|
+ accessToken.getTokenValue(), accessToken.getIssuedAt(), accessToken.getExpiresAt(),
|
|
|
+ accessToken.getScopes());
|
|
|
+ builder.token(oauth2AccessToken, (metadata) -> {
|
|
|
+ metadata.put(OAuth2Authorization.Token.INVALIDATED_METADATA_NAME, accessToken.isInvalidated());
|
|
|
+ metadata.put(OAuth2Authorization.Token.CLAIMS_METADATA_NAME, accessToken.getClaims().getClaims());
|
|
|
+ metadata.put(OAuth2TokenFormat.class.getName(), accessToken.getTokenFormat().getValue());
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ static void mapRefreshToken(OAuth2AuthorizationGrantAuthorization.RefreshToken refreshToken,
|
|
|
+ OAuth2Authorization.Builder builder) {
|
|
|
+ if (refreshToken == null) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ OAuth2RefreshToken oauth2RefreshToken = new OAuth2RefreshToken(refreshToken.getTokenValue(),
|
|
|
+ refreshToken.getIssuedAt(), refreshToken.getExpiresAt());
|
|
|
+ builder.token(oauth2RefreshToken, (metadata) -> metadata
|
|
|
+ .put(OAuth2Authorization.Token.INVALIDATED_METADATA_NAME, refreshToken.isInvalidated()));
|
|
|
+ }
|
|
|
+
|
|
|
+ static void mapIdToken(OidcAuthorizationCodeGrantAuthorization.IdToken idToken,
|
|
|
+ OAuth2Authorization.Builder builder) {
|
|
|
+ if (idToken == null) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ OidcIdToken oidcIdToken = new OidcIdToken(idToken.getTokenValue(), idToken.getIssuedAt(),
|
|
|
+ idToken.getExpiresAt(), idToken.getClaims().getClaims());
|
|
|
+ builder.token(oidcIdToken, (metadata) -> {
|
|
|
+ metadata.put(OAuth2Authorization.Token.INVALIDATED_METADATA_NAME, idToken.isInvalidated());
|
|
|
+ metadata.put(OAuth2Authorization.Token.CLAIMS_METADATA_NAME, idToken.getClaims().getClaims());
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ static void mapDeviceCode(OAuth2DeviceCodeGrantAuthorization.DeviceCode deviceCode,
|
|
|
+ OAuth2Authorization.Builder builder) {
|
|
|
+ if (deviceCode == null) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ OAuth2DeviceCode oauth2DeviceCode = new OAuth2DeviceCode(deviceCode.getTokenValue(), deviceCode.getIssuedAt(),
|
|
|
+ deviceCode.getExpiresAt());
|
|
|
+ builder.token(oauth2DeviceCode, (metadata) -> metadata.put(OAuth2Authorization.Token.INVALIDATED_METADATA_NAME,
|
|
|
+ deviceCode.isInvalidated()));
|
|
|
+ }
|
|
|
+
|
|
|
+ static void mapUserCode(OAuth2DeviceCodeGrantAuthorization.UserCode userCode, OAuth2Authorization.Builder builder) {
|
|
|
+ if (userCode == null) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ OAuth2UserCode oauth2UserCode = new OAuth2UserCode(userCode.getTokenValue(), userCode.getIssuedAt(),
|
|
|
+ userCode.getExpiresAt());
|
|
|
+ builder.token(oauth2UserCode, (metadata) -> metadata.put(OAuth2Authorization.Token.INVALIDATED_METADATA_NAME,
|
|
|
+ userCode.isInvalidated()));
|
|
|
+ }
|
|
|
+
|
|
|
+}
|