春天的Webflux和Keycloak JWT rest api。

问题描述 投票:2回答:1

我正在我的Webflux rest api上构建一个userinfo端点,如何访问rest调用中通过授权头传递进来的access_token。还需要一个类似的端点来更新用户。

我在最新的spring 5boot 2中找到的所有例子都是关于保护webapp的。

@GetMapping("/api/user-info")
    public Map userInfo(OAuth2AuthenticationToken authentication) {
        OAuth2AuthorizedClient authorizedClient = this.getAuthorizedClient(authentication);
        Map userAttributes = Collections.emptyMap();

        String userInfoEndpointUri = authorizedClient
                                    .getClientRegistration()
                                    .getProviderDetails()
                                    .getUserInfoEndpoint()
                                    .getUri();

        if (!StringUtils.isEmpty(userInfoEndpointUri)) {
            // userInfoEndpointUri is optional for OIDC Clients
            userAttributes = WebClient.builder()
                    .filter(oauth2Credentials(authorizedClient))
                    .build()
                    .get()
                    .uri(userInfoEndpointUri)
                    .retrieve()
                    .bodyToMono(Map.class)
                    .block();
        }

        return userAttributes;
    }

    private OAuth2AuthorizedClient getAuthorizedClient(OAuth2AuthenticationToken authentication) {
        return this.authorizedClientService.loadAuthorizedClient(
                authentication.getAuthorizedClientRegistrationId(), authentication.getName());
    }

    private ExchangeFilterFunction oauth2Credentials(OAuth2AuthorizedClient authorizedClient) {
        return ExchangeFilterFunction.ofRequestProcessor(
                clientRequest -> {
                    ClientRequest authorizedRequest = ClientRequest.from(clientRequest)
                            .header(HttpHeaders.AUTHORIZATION, "Bearer " + authorizedClient.getAccessToken().getTokenValue())
                            .build();
                    return Mono.just(authorizedRequest);
                });
    }

方法中定义的OAuth2AuthenticationToken对象是空的,这可以理解,但不知道还有什么需要配置。

谢谢你的帮助。

java spring spring-security-oauth2 keycloak spring-webflux
1个回答
© www.soinside.com 2019 - 2024. All rights reserved.