Как я могу получить твит-паспорт 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);
});
});