OID рабочего стола C Безопасность приложения Spring: настройка клиента с начальными токенами - PullRequest
1 голос
/ 04 мая 2020

У нас есть Java настольное приложение Spring, которое мы сейчас переводим в OID C безопасности (пока с keycloak). Для этого мы встроили браузер в Java Приложение для запуска аутентификации и получения набора предоставленных токенов (access, refre sh, id).

Теперь мы хотел интегрировать эти токены с безопасностью Spring, чтобы мы могли использовать фильтр на нашем WebClient (который вызывает сервер), а также чтобы Spring мог обрабатывать токен доступа refre sh process.

Мы пытаемся найти лучший подход для достижения этой цели.

На данный момент у нас есть решение для анализа токенов Access и Refre sh для создания авторизованных клиентов. В таких случаях мы создаем AuthorizedClientProvider как:

var authorizedClientProvider = ReactiveOAuth2AuthorizedClientProviderBuilder.builder()
            .refreshToken()
            .provider(context -> {

                if (context.getAuthorizedClient() != null) {
                    return Mono.empty();
                }

                ObjectMapper objMapper = new ObjectMapper();

                TypeReference<Map<String, Object>> type = new TypeReference<Map<String, Object>>() {//
                };

                Map<String, Object> jsonMap = null;
                try {
                    jsonMap = objMapper.readValue(accessTokenValue, type);
                }
                catch (JsonProcessingException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

                AccessTokenResponse parsedAccessToken = null;
                try {
                    parsedAccessToken = (AccessTokenResponse) TokenResponse.parse(new JSONObject(jsonMap));
                }
                catch (ParseException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

                OAuth2AccessTokenResponse accessTokenResponse = oauth2AccessTokenResponse(parsedAccessToken);

                return Mono.just(
                        new OAuth2AuthorizedClient(
                                context.getClientRegistration(),
                                context.getPrincipal().getName(),
                                accessTokenResponse.getAccessToken(),
                                accessTokenResponse.getRefreshToken()));
            })
            .build();

И затем мы создаем фильтр WebClient как:

        String baseUrl = theOpts.getAuthServiceBaseUrl();
        if (baseUrl == null) {
            baseUrl = theOpts.getAuthServiceIssuerUrl();
        }

        clientRegistration = ClientRegistration.withRegistrationId(AUTHSERVICE_REGISTRATION_ID)
            .userNameAttributeName(IdTokenClaimNames.SUB)
            .authorizationGrantType(AuthorizationGrantType.REFRESH_TOKEN)
            .clientAuthenticationMethod(ClientAuthenticationMethod.POST)
            .clientId("myClientId")
            .jwkSetUri(theAuthServiceIssuerUrl + OIDC_CERTS_ENDPOINT)
            .tokenUri(theAuthServiceIssuerUrl + OIDC_TOKEN_ENDPOINT)
            .build();

        ReactiveClientRegistrationRepository inMemoryReactiveClientRegistrationRepository = new InMemoryReactiveClientRegistrationRepository(clientRegistration);

        ReactiveOAuth2AuthorizedClientService authorizedClientService = new InMemoryReactiveOAuth2AuthorizedClientService(inMemoryReactiveClientRegistrationRepository);

        AuthorizedClientServiceReactiveOAuth2AuthorizedClientManager authorizedClientManager = new AuthorizedClientServiceReactiveOAuth2AuthorizedClientManager(
                inMemoryReactiveClientRegistrationRepository,
                authorizedClientService);
        authorizedClientManager.setAuthorizedClientProvider(authorizedClientProvider);

        ServerOAuth2AuthorizedClientExchangeFilterFunction oauthFilter = new ServerOAuth2AuthorizedClientExchangeFilterFunction(authorizedClientManager);

        oauthFilter.setDefaultOAuth2AuthorizedClient(true);
        oauthFilter.setDefaultClientRegistrationId(AUTHSERVICE_REGISTRATION_ID);
        return oauthFilter;

Таким образом, несмотря на такой подход, мы можем сохранить маркер доступа (и refre sh it) это не совсем позволяет нам создать Аутентификацию для приложения с этими токенами (по глобальной стратегии). Я ожидал, что смогу каким-то образом использовать токен ID.

Мы видели, что Spring внутренне создает OAuth2AuthorizationCodeAuthenticationToken, когда получает токены в потоке входа в систему (который мы не используем). Это похоже на объект аутентификации, который мы должны создать, но он требует наличия информации об обмене сообщениями, которой у нас нет в нашем случае использования. Затем мы можем видеть, что этот объект обмена используется в других местах кода Spring Security, поэтому мы не можем его игнорировать.

Также мы видели, что в InMemoryReactiveOAuth2AuthorizedClientService у нас есть метод для привязки OAuth2AuthorizedClient с объектом аутентификации. Но мы не уверены, является ли это путь или что именно нужно сделать.

Будет ли соответствующий объект аутентификации, который мы должны использовать, чтобы сохранить ссылку на токены (e c: идентификатор токена ) в приложении?

Кто-нибудь знает, как настроить / обеспечить это, чтобы это интегрированное решение браузера работало?

Заранее спасибо за любую помощь.

С уважением

Жуан

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...