Spring Security OAuth2 не может проанализировать область при возврате в виде массива - PullRequest
1 голос
/ 28 июня 2019

Я настраиваю веб-сервер, который использует поток кода авторизации Twitch для входа в систему пользователя с помощью потока кода авторизации.

Шаг авторизации уже работает, но jaxson выдает исключение во время шага, когда он извлекает токен из Twitch. Пролистывая код безопасности oauth2, похоже, что jaxson анализирует область видимости как строку, но Twitch возвращает область видимости как массив строк, вызывающих выброс jaxson. Я думаю, может быть, я мог бы переопределить анализатор jaxson, но я не уверен, как это сделать.

Вот как выглядит возврат токена из Twitch:

{
   "access_token": <access-token>,
   "refresh_token": <refresh-token>,
   "expires_in": 3600,
   "scope": ["viewing_activity_read"],
   "token_type": "bearer"
}

Область, являющаяся массивом, вызывает проблему на этом этапе в OAuth2AccessTokenResponseHttpMessageConverter в this.jsonMessageConverter.read:

@Override
    protected OAuth2AccessTokenResponse readInternal(Class<? extends OAuth2AccessTokenResponse> clazz, HttpInputMessage inputMessage)
            throws IOException, HttpMessageNotReadableException {

        try {
            @SuppressWarnings("unchecked")
            Map<String, String> tokenResponseParameters = (Map<String, String>) this.jsonMessageConverter.read(
                    PARAMETERIZED_RESPONSE_TYPE.getType(), null, inputMessage);
            return this.tokenResponseConverter.convert(tokenResponseParameters);
        } catch (Exception ex) {
            throw new HttpMessageNotReadableException("An error occurred reading the OAuth 2.0 Access Token Response: " +
                    ex.getMessage(), ex, inputMessage);
        }
    }

Спасибо!

1 Ответ

1 голос
/ 28 июня 2019

Я разобрался с решением. Это две части, во-первых, вы должны переопределить OAuth2AccessTokenResponseHttpMessageConverter и внести необходимые изменения для работы с токеном, который отформатирован. Я нашел пример переопределения OAuth2AccessTokenResponseHttpMessageConverter здесь . Это не совсем то, как я отверг это, потому что мне нужно было проанализировать массив, но это хорошее начало для тех, кто в этом нуждается. Затем вы добавляете переопределенный класс в вашу WebSecurityConfigurerAdapter конфигурацию. Я создал метод, который возвращает OAuth2AccessTokenResponseClient<OAuth2AuthorizationCodeGrantRequest>, используя мою версию OAuth2AccessTokenResponseHttpMessageConverter.

private OAuth2AccessTokenResponseClient<OAuth2AuthorizationCodeGrantRequest> accessTokenResponseClient() {
        DefaultAuthorizationCodeTokenResponseClient client = new DefaultAuthorizationCodeTokenResponseClient();
        RestTemplate restTemplate = new RestTemplate(Arrays.asList(
                new FormHttpMessageConverter(), new OAuth2AccessTokenResponseHttpMessageConverter()));
        HttpClient requestFactory = HttpClientBuilder.create().build();
        restTemplate.setRequestFactory(new HttpComponentsClientHttpRequestFactory(requestFactory));
        restTemplate.setErrorHandler(new OAuth2ErrorResponseErrorHandler());
        client.setRestOperations(restTemplate);
        return client;
    }

Затем я добавил accessTokenResponseClient() в конфигурацию HttpSecurity.

 @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            //
            .oauth2Login()
            .tokenEndpoint()
            .accessTokenResponseClient(accessTokenResponseClient())
            //
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...