Как сгенерировать токен доступа OAuth2 после аутентификации в клиенте - PullRequest
0 голосов
/ 31 октября 2019

Я изучаю реализацию безопасности 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

...