8

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(プロキシ); 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);、アクセストークンを取得しようとするこの最初の行が原因で発生しています。つまり、プロキシ設定も必要です。以下の行を追加すると動作します:

System.setProperty("https.proxyHost", "urproxy.com");
System.setProperty("https.proxyPort", "8080");

しかし、Tomcat サーバーに設定する権限がないため、System.setProperties("","") オプションを使用できません。

調査しましたが、このオブジェクトの作成中に OAuth2RestTemplate にプロキシを設定する方法が見つかりませんでした。

どんな助けでも大歓迎です。ありがとう

4

2 に答える 2

0

この RestTemplate は回避策を提供します。

/**
 * An OAuth2RestTemplate with proxy support.
 * 
 * @author E.K. de Lang
 */
public class ProxySupportingOAuth2RestTemplate
    extends OAuth2RestTemplate
{
    private static final Logger LOG = LogFactory.getLogger(ProxySupportingOAuth2RestTemplate.class);

    private final SimpleClientHttpRequestFactory factory;

    public ProxySupportingOAuth2RestTemplate(OAuth2ProtectedResourceDetails resource, OAuth2ClientContext context,
            AccessTokenProvider accessTokenProvider)
    {
        super(resource, context);
        factory = new SimpleClientHttpRequestFactory();
        super.setRequestFactory(factory);
        super.setAccessTokenProvider(accessTokenProvider);

        // To fix issue: https://github.com/spring-projects/spring-security-oauth/issues/459 also set the factory of the token-provider.
        if (accessTokenProvider instanceof OAuth2AccessTokenSupport) {
            ((OAuth2AccessTokenSupport) accessTokenProvider).setRequestFactory(factory);
        }
        else {
            throw new UnsupportedOperationException("accessTokenProvider must extend OAuth2AccessTokenSupport");
        }
    }

    public void setProxy(Proxy proxy)
    {
        if (LOG.isDebugEnabled()) {
            LOG.debug("setProxy:" + proxy);
        }
        if (super.getRequestFactory() == factory) {
            factory.setProxy(proxy);
        }
        else {
            throw new UnsupportedOperationException("RequestFactory has changed.");
        }
    }
}
于 2018-12-03T14:26:04.623 に答える