Я изучаю реализацию безопасности Baeldung Spring и OAuth2. У меня запущен проект Spring Security Login and Registration, который хотел бы расширить его для доступа к защищенным ресурсам OAuth2. Приложение зарегистрировано на моем сервере авторизации, но я не могу получить токен доступа. Мой второй вопрос касается того, где пользовательская база данных обычно хранится в реальном сценарии. В проекте Baeldung это настройка в клиентском приложении, поэтому пользователь может проходить аутентификацию, но сервер авторизации не имеет к этому доступа. Я мог бы разрешить серверу авторизации использовать одну и ту же базу данных, но я не вижу, чтобы это был реальный сценарий, когда разработчики создают клиентские приложения отдельно от организаций, которые создают серверы авторизации и ресурсов. Любое разъяснение этого будет полезно.
открытый класс AuthorizationHeaderInterceptor реализует ClientHttpRequestInterceptor {
private OAuth2AuthorizedClientService clientService;
public AuthorizationHeaderInterceptor(OAuth2AuthorizedClientService clientService) {
this.clientService = clientService;
}
@Override
public ClientHttpResponse intercept(HttpRequest request, byte[] bytes, ClientHttpRequestExecution execution) throws IOException {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
String accessToken = null;
OAuth2AuthenticationToken auth = (OAuth2AuthenticationToken) authentication;
if (authentication != null && authentication.getClass().isAssignableFrom(OAuth2AuthenticationToken.class)) {
//OAuth2AuthenticationToken auth = (OAuth2AuthenticationToken) authentication;
String clientRegistrationId = auth.getAuthorizedClientRegistrationId();
OAuth2AuthorizedClient client = clientService.loadAuthorizedClient(clientRegistrationId, auth.getName());
accessToken = client.getAccessToken().getTokenValue();
request.getHeaders().add("Authorization", "Bearer " + accessToken);
}
return execution.execute(request, bytes);
}
}
На этом этапе я могу зарегистрироваться / войти в клиентское приложение. После проверки подлинности пользователь отправляется на веб-страницу, которая выполняет повторный вызов серверной части, и указанный код выполняется. Я ожидал получить неверный ответ с учетными данными, поскольку сервер авторизации не знает о клиентской базе данных (вот почему я прошу прояснить пример использования в реальном мире). Однако вместо этого я получаю эту ошибку и не нахожу ответов о том, как ее исправить.
org.springframework.security.authentication.UsernamePasswordAuthenticationToken нельзя преобразовать в org.springframework.security.oauth2.client.authentication.OAuth2AuthenticationToken