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