Конфигурация прокси в OAuth2RestTemplate

Мне нужно использовать API, защищенный OAuth2. Для этого я использую 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 = новый 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");

Но я не могу использовать параметр System.setProperties("",""), так как у нас нет разрешения на установку на сервере tomcat.

Я исследовал, но не смог найти способ установить прокси в OAuth2RestTemplate при создании этого объекта.

Любая помощь будет оценена по достоинству. Спасибо


person aks2012    schedule 10.08.2016    source источник
comment
Пожалуйста, дайте мне знать, если вопрос не ясен. Благодарим за любую помощь.   -  person aks2012    schedule 04.10.2016


Ответы (2)


OAuth2RestTemplate просто создает набор AccessTokenProvider для получения токена с сервера авторизации в соответствии с различными типами грантов. Например, AuthorizationCodeAccessTokenProvider используется для получения токена доступа с типом гранта author_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);

Вы также можете добавить ResourceOwnerPasswordAccessTokenProvider и ClientCredentialsAccessTokenProvider в OAuth2RestTemplate.

person kvy    schedule 27.03.2017

Этот 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.");
        }
    }
}
person Eelco    schedule 03.12.2018
comment
Куда вы звоните setProxy? - person Minisha; 30.01.2020