OAuth2RestTemplate中的代理配置

aks*_*012 6 proxy oauth2client spring-security-oauth2 oauth2

我需要使用由OAuth2保护的API.为此我使用OAuth2RestTemplate.但我得到以下错误:

java.net.ConnectException: Connection timed out: connect
Run Code Online (Sandbox Code Playgroud)

由于代理问题,这种情况正在发生.我知道如何在RestTemplate中设置代理:

 SimpleClientHttpRequestFactory clientHttpRequestFactory = new       SimpleClientHttpRequestFactory();
 Proxy proxy = new Proxy(Proxy.Type.HTTP, new      InetSocketAddress("Proxy host", 8080));
Run Code Online (Sandbox Code Playgroud)

clientHttpRequestFactory.setProxy(代理); RestTemplate restTemplate = new RestTemplate(clientHttpRequestFactory);

我尝试为OAuth2RestTemplate设置的方式相同:

@Bean
public OAuth2RestOperations restTemplate(OAuth2ClientContext oauth2ClientContext) {
    OAuth2RestTemplate client =  new OAuth2RestTemplate(resource(), oauth2ClientContext);
    SimpleClientHttpRequestFactory clientHttpRequestFactory = new SimpleClientHttpRequestFactory();
    Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(PROXY_HOST, PROXY_PORT));
    clientHttpRequestFactory.setProxy(proxy);
    client.setRequestFactory(clientHttpRequestFactory);
    return client;
}
Run Code Online (Sandbox Code Playgroud)

但它不起作用并给出"连接超时"例外.发生这种情况是因为第一行OAuth2RestTemplate client = new OAuth2RestTemplate(resource(), oauth2ClientContext);尝试获取Access令牌,这意味着它还需要代理设置.如果我添加以下行,那么它的工作原理:

System.setProperty("https.proxyHost", "urproxy.com");
System.setProperty("https.proxyPort", "8080");
Run Code Online (Sandbox Code Playgroud)

但我不能使用System.setProperties("","")选项,因为我们没有权限在tomcat服务器上设置.

我研究过但在创建此对象时找不到任何在OAuth2RestTemplate中设置代理的方法.

任何帮助,将不胜感激.谢谢

kvy*_*kvy 10

OAuth2RestTemplate只需AccessTokenProvider根据不同类型的授权类型创建一组从授权服务器检索令牌.例如AuthorizationCodeAccessTokenProvider,用于使用grant type authorization_code检索访问令牌.令牌提供者自己发起一些RestTemplate发送请求但不使用OAuth2RestTemplate刚刚创建的请求.一种方法可以解决问题.那就是创建自己的AccessTokenProvider并设置请求工厂.

SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();
Proxy proxy= new Proxy(Type.HTTP, new InetSocketAddress(PROXY_HOST, PROXY_PORT));
requestFactory.setProxy(proxy);      

AuthorizationCodeAccessTokenProvider authorizationCodeAccessTokenProvider = new AuthorizationCodeAccessTokenProvider();
authorizationCodeAccessTokenProvider.setRequestFactory(requestFactory);

ImplicitAccessTokenProvider implicitAccessTokenProvider = new ImplicitAccessTokenProvider();
implicitAccessTokenProvider.setRequestFactory(requestFactory);

AccessTokenProvider accessTokenProvider = new AccessTokenProviderChain(
Arrays.<AccessTokenProvider> asList(authorizationCodeAccessTokenProvider, implicitAccessTokenProvider));

OAuth2RestTemplate client = new OAuth2RestTemplate(github(), oauth2ClientContext);
client.setAccessTokenProvider(accessTokenProvider);
Run Code Online (Sandbox Code Playgroud)

您还可以将ResourceOwnerPasswordAccessTokenProvider和ClientCredentialsAccessTokenProvider添加到OAuth2RestTemplate.