Как я могу получить твит-паспорт Nodejs за прокси-сервером?

Я тестирую твиттер-аутентификацию, используя модуль nodejs для passport-twitter. Я уже создал свое приложение Twitter и настроил все как указано в учебниках. Проблема в том, что я нахожусь за корпоративным прокси-сервером, и, насколько я знаю, узел не имеет глобальной конфигурации прокси и не учитывает конфигурацию системного прокси. Это вывод, который я получаю, когда пытаюсь аутентифицироваться с помощью твиттер-паспорта:

InternalOAuthError: Не удалось получить токен запроса в Strategy.OAuthStrategy._createOAuthError (/home/droid/WebstormProjects/passport-social-master/node_modules/passport-oauth1/lib/strategy.js:390:13) в / home / droids Web /passport-social-master/node_modules/passport-oauth1/lib/strategy.js:244:40 at /home/droid/WebstormProjects/passport-social-master/node_modules/oauth/lib/oauth.js:543:17 at ClientRequest. (/home/droid/WebstormProjects/passport-social-master/node_modules/oauth/lib/oauth.js:421:9) в emitOne (events.js:77:13) в ClientRequest.emit (events.js:169:7) в TLSSocket.socketErrorListener (_http_client.js:265:9) в emitOne (events.js:77:13) в TLSSocket.emit (events.js:169:7) в connectErrorNT (net.js:996:8) в doNTCallback2 (node.js:452:9) в process._tickCallback (node.js:366:17)

До сих пор я пытался установить глобальный туннель, используя это:

var globalTunnel = require('global-tunnel');
globalTunnel.initialize({
  host: 'proxy.example.com',
  port: 8080
});

В этом случае все, что я получаю, это сообщение:

Ошибка типа: Путь к запросу содержит неэкранированные символы. в новом ClientRequest (_http_client.js:54:11) в exports.request (http.js:31:10) в TunnelingAgent.http.request (/home/droid/WebstormProjects/passport-social-master/http-proxy.js:36:15) в TunnelingAgent.createSocket (/home/droid/WebstormProjects/passport-social-master/node_modules/tunnel/lib/tunnel.js:116:25) в TunnelingAgent.createSecureSocket [as createSocket] (/home/droid/WebstormProjects/passport-social-master/node_modules/tunnel/lib/tunnel.js:188:41) в TunnelingAgent.addRequest (/home/droid/WebstormProjects/passport-social-master/node_modules/tunnel/lib/tun.:80:8) в новом ClientRequest (_http_client.js:139:16) в exports.request (http.js:31:10) в Object.http.request (/home/droid/WebstormProjects/passport-social-master/http-proxy.js:36:15) в Object.globalTunnel._defaptedAgentRequest (/home/droid/WebstormProjects/passport-social-master/node_modules/global-tunnel/index.js:211:38) в Object.exports.request (https.js:173:15) на Object.globalTunnel._defaptedAgentRequest (/home/droid/WebstormProjects/passport-social-master/node_modules/global-tunnel/index.js:211:38) at exports.OAuth._createClient (/home/droid/WebstormProjects/passport-social-master/ passport-social-master / node_modules/oauth/lib/oauth.js:256:20) at exports.OAuth._performSecureRequest (/home/droid/WebstormProjects/passport-social-master/node_modules/oauth/lib/oauth.js:371:19) в exports.OAuth.getOAuthRequestToken (/home/droid/WebstormProjects/passport-social-master/node_modules/oauth/lib/oauth.js:542:8) в Strategy.OAuthStrategy.authenticate (/home/droid/WebstormProjects/passport-social-master/node_modules/passport-oauth1/ Библиотека /strategy.js:242:21)

Я тоже попробовал полуглобальный прокси ( http://blog.shaunxu.me/archive/2013/09/05/semi-global-proxy-setting-for-node.js.aspx) от Shaun Xu. Я импортировал модифицированный require.js везде, но ничего не работает. Так что я получаю без вариантов...

1 ответ

Ваша проблема:

Старая зависимость в глобальном туннеле. см. глобальный туннель № 13

Быстрое решение: обновление зависимости узла-туннеля до 0.0.4, похоже, не работает в конце, поскольку его использование перенаправит все запросы в интернет-прокси, а не только на запросы аутентификации.


Это "старый" пост, но если у кого-то есть похожая проблема:

Случай использования:

  • Сервер находится за интернет-прокси
  • Сервер получает доступ к локальным ресурсам через http / https, например сервер эластичного поиска, который не должен запрашиваться через прокси
  • Вы используете passportJs с модулем аутентификации, который требует внешней проверки токена, например, Google на https://accounts.google.com/

Проблема:

  • По умолчанию NodeJs не учитывает настройки прокси-сервера системы.
  • Прокси-сервер компании не пересылает внутренний запрос через интернет-прокси (например, если прокси-сервер настроен, все запросы поступают на интернет-прокси, больше не в интрасети или на локальном хосте)

Решение не работает:

Установка системного env HTTP_PROXY или HTTPS_PROXY не работает по 2 причинам:

  • NodeJs игнорируют их
  • Прокси установлен для всех запросов, и вы хотите, чтобы только один конкретный запрос проходил через прокси

Использование глобального прокси (global-tunnel или аналогичного) не удастся, потому что они перенаправят все запросы, добавив своего собственного агента (request.options.agent), и, таким образом, перенаправят весь ваш трафик на ваш прокси. Не желательно

Решение:

Используйте код, подобный глобальному туннелю, добавляя белый список в прокси только для некоторых имен хостов.

Я успешно внедрил и протестировал это решение: см. https://github.com/bloublou2014/httpx-proxy-agent-config

Пример использования:

var proxy = require('httpx-proxy-agent-config');

proxy.install({
http_proxy: 'http://yourProxy:3128',
https_proxy: 'http://yourHttpsProxy:3218',
// example for passportjs Google OAuth2 + Google+
whitelist: ['www.google.com','accounts.google.com', '173.194.66.95', '74.125.192.95', '209.85.201.95', 'www.googleapis.com']
});

// try to access a page via http request :
var http = require('http');
http.get('http://www.google.com', function (response) { 
    var body = '';
    response.on('data', function (d) {
        body += d;
    });
    response.on('end', function () {
        console.log("Body=", body);
    });
});

// try to access a page via https request
var https = require('https');
https.get('https://www.google.com', function (response) {   
    var body = '';
    response.on('data', function (d) {
        body += d;
    });
    response.on('end', function () {
        console.log("Body=", body);
    });
});
Другие вопросы по тегам