У нас есть 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: идентификатор токена ) в приложении?
Кто-нибудь знает, как настроить / обеспечить это, чтобы это интегрированное решение браузера работало?
Заранее спасибо за любую помощь.
С уважением
Жуан