我需要使用由 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/

10-09 17:22