我需要使用由 OAuth2 保护的 API。为此,我正在使用OAuth2RestTemplate。
但我收到以下错误:
java.net.ConnectException: Connection timed out: connect
这是由于代理问题而发生的。我知道如何在 RestTemplate 中设置代理:
SimpleClientHttpRequestFactory clientHttpRequestFactory = new SimpleClientHttpRequestFactory();
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("Proxy host", 8080));
clientHttpRequestFactory.setProxy(proxy);
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;
}
但它不起作用并给出“连接超时”异常。这是因为第一行
OAuth2RestTemplate client = new OAuth2RestTemplate(resource(), oauth2ClientContext);
试图获取访问 token ,这意味着它也需要代理设置。如果我添加以下几行,那么它的工作原理:System.setProperty("https.proxyHost", "urproxy.com");
System.setProperty("https.proxyPort", "8080");
但是我不能使用 System.setProperties("","") 选项,因为我们没有在 tomcat 服务器上设置的权限。
我进行了研究,但在创建此对象时找不到任何在 OAuth2RestTemplate 中设置代理的方法。
任何帮助,将不胜感激。谢谢
最佳答案
OAuth2RestTemplate
只是根据不同的授权类型创建一组 AccessTokenProvider
来从授权服务器检索 token 。例如 AuthorizationCodeAccessTokenProvider
用于检索授权类型 authorization_code 的访问 token 。 token 提供者自己启动一些 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);
您还可以将 ResourceOwnerPasswordAccessTokenProvider 和 ClientCredentialsAccessTokenProvider 添加到 OAuth2RestTemplate。
关于OAuth2RestTemplate 中的代理配置,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38884073/