How can I refresh the Id Token in Spring Cloud Gateway

161 Views Asked by At

I created a CustomTokenRelayGatewayFilterFactory and it works fine. But I also want to refresh the Id token, does anyone have an idea how I can go about that?

private Mono<OAuth2AuthorizedClient> refreshAuthorizedClient(
            final ServerWebExchange exchange,
            final OAuth2AuthorizedClient authorizedClient,
            final OAuth2AuthenticationToken oauth2Authentication) {
        final ClientRegistration clientRegistration = authorizedClient.getClientRegistration();
        HttpHeaders headers = new HttpHeaders();
        headers.setBasicAuth(clientRegistration.getClientId(), clientRegistration.getClientSecret());
        headers.add(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON_VALUE);
        return webClientBuilder.build()
                .method(HttpMethod.POST)
                .uri(clientRegistration.getProviderDetails().getTokenUri())
                .headers(header -> header.addAll(headers))
                .bodyValue(refreshTokenBody(authorizedClient.getRefreshToken().getTokenValue()))
                .exchangeToMono(refreshResponse -> {
                    if (refreshResponse.statusCode().equals(HttpStatus.BAD_REQUEST)) {
                        System.err.println("The refresh token or sessions expired.");
                        throw new ResponseStatusException(HttpStatus.UNAUTHORIZED, TOKEN_REFRESHMENT_ERROR_MESSAGE);
                    } else {
                        return refreshResponse.body(oauth2AccessTokenResponse());
                    }
                })
                .map(accessTokenResponse -> {
                    OAuth2RefreshToken refreshToken = Optional.ofNullable(accessTokenResponse.getRefreshToken())
                            .orElse(authorizedClient.getRefreshToken());
                    System.err.println(accessTokenResponse.getAdditionalParameters());
                    return new OAuth2AuthorizedClient(authorizedClient.getClientRegistration(), authorizedClient.getPrincipalName(), accessTokenResponse.getAccessToken(), refreshToken);
                })
                .flatMap(result -> this.authorizedClientRepository.saveAuthorizedClient(result, oauth2Authentication, exchange).thenReturn(result));
    }

    private static MultiValueMap<String, String> refreshTokenBody(final String refreshToken) {
        final MultiValueMap<String, String> body = new LinkedMultiValueMap<>();
        body.add(GRANT_TYPE_KEY, AuthorizationGrantType.REFRESH_TOKEN.getValue());
        body.add(REFRESH_TOKEN_KEY, refreshToken);
        return body;
    }
0

There are 0 best solutions below