gpt4 book ai didi

Spring Security OAuth2 在作为数组返回时无法解析范围

转载 作者:行者123 更新时间:2023-12-05 03:59:56 25 4
gpt4 key购买 nike

我正在设置一个网络服务器,它使用 Twitch 授权代码流来使用授权代码流登录用户。

授权步骤已经有效,但 jaxson 在从 Twitch 检索 token 的步骤中抛出异常。深入研究 oauth2 安全代码,jaxson 似乎将范围解析为字符串,但 Twitch 将范围作为字符串数组返回,导致 jaxson 抛出异常。我在想也许我可以覆盖 jaxson 解析器,但我不确定该怎么做。

这是从 Twitch 返回的代币的样子:

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

this.jsonMessageConverter.readOAuth2AccessTokenResponseHttpMessageConverter 中,作为数组的范围导致了此时的问题:

@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);
}
}

谢谢!

最佳答案

我找到了解决方案。它分为两部分,首先你必须覆盖 OAuth2AccessTokenResponseHttpMessageConverter并进行必要的更改以使用 token 的格式。我找到了 OAuth2AccessTokenResponseHttpMessageConverter 的例子覆盖 here .这不是我完全覆盖它的方式,因为我需要解析一个数组,但对于任何需要它的人来说,这是一个好的开始。接下来,在 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())
//
}

关于Spring Security OAuth2 在作为数组返回时无法解析范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56799002/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com