Estoy configurando un servidor web que utiliza el flujo de código de autorización de Twitch para iniciar sesión en un usuario utilizando el flujo de código de autorización.

El paso de autorización ya funciona, pero Jaxson lanza una excepción durante el paso donde recupera el token de Twitch. Cavando a través del código de seguridad OAUTH2, parece que Jaxson analiza el alcance como una cadena, pero Twitch devuelve el alcance como una matriz de cadenas que causan que Jaxson lanza. Estoy pensando que tal vez podría anular el analizador de Jaxson, pero no estoy seguro de cómo hacerlo hacerlo.

Así es como se ve el token regreso de Twitch:

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

El alcance que es una matriz está causando el problema en este punto en OAuth2AccessTokenResponseHttpMessageConverter en 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);
        }
    }

¡Gracias!

2
Brandon Feist 28 jun. 2019 a las 01:10

1 respuesta

La mejor respuesta

Me di cuenta de la solución. Es dos partes, primero tiene que anular OAuth2AccessTokenResponseHttpMessageConverter y hacer los cambios necesarios para trabajar, sin embargo, se formatea el token. Encontré un ejemplo de la OAuth2AccessTokenResponseHttpMessageConverter anulando aquí. Esto no es exactamente cómo lo anularé porque necesitaba analizar una matriz, pero es un buen comienzo para cualquier persona que lo necesite. A continuación, agregue la clase Overrideren en su configuración WebSecurityConfigurerAdapter. Creé un método que devuelve un OAuth2AccessTokenResponseClient<OAuth2AuthorizationCodeGrantRequest> usando mi versión de 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;
    }

Luego agregué el accessTokenResponseClient() a la configuración HttpSecurity.

 @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            //
            .oauth2Login()
            .tokenEndpoint()
            .accessTokenResponseClient(accessTokenResponseClient())
            //
}
2
Brandon Feist 28 jun. 2019 a las 09:58