当作为数组返回时,Spring Security OAuth2无法解析作用域

当作为数组返回时,Spring Security OAuth2无法解析作用域,spring,spring-security,oauth-2.0,Spring,Spring Security,Oauth 2.0,我正在设置一个web服务器,该服务器使用Twitch授权代码流来登录用户 授权步骤已经开始工作,但是jaxson在从Twitch检索令牌的步骤中抛出了一个异常。通过挖掘oauth2安全代码,看起来jaxson将作用域解析为字符串,但Twitch将作用域返回为字符串数组,导致jaxson抛出。我在想也许我可以重写jaxson解析器,但我不知道如何去做 这是Twitch返回的令牌的样子: { "access_token": <access-token>, "refresh_t

我正在设置一个web服务器,该服务器使用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
,并进行必要的更改以处理标记的格式。 我找到了一个
OAuth2AccessTokenResponseHttpMessageConverter
覆盖的示例。这并不完全是我重写它的方式,因为我需要解析数组,但对于任何需要它的人来说,这都是一个好的开始。 接下来,在
websecurityConfigureAdapter
配置中添加被重写的类。我使用自己版本的
OAuth2AccessTokenResponseHttpMessageConverter
创建了一个返回
OAuth2AccessTokenResponseClient
的方法

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;
    }
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;
    }
 @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            //
            .oauth2Login()
            .tokenEndpoint()
            .accessTokenResponseClient(accessTokenResponseClient())
            //
}