2015-12-11 2 views
1

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

InternalOAuthError: Failed to obtain request token at Strategy.OAuthStrategy._createOAuthError (/home/droid/WebstormProjects/passport-social-master/node_modules/passport-oauth1/lib/strategy.js:390:13) at /home/droid/WebstormProjects/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) at emitOne (events.js:77:13) at ClientRequest.emit (events.js:169:7) at TLSSocket.socketErrorListener (_http_client.js:265:9) at emitOne (events.js:77:13) at TLSSocket.emit (events.js:169:7) at connectErrorNT (net.js:996:8) at doNTCallback2 (node.js:452:9) at process._tickCallback (node.js:366:17)

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

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

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

TypeError: Request path contains unescaped characters. at new ClientRequest (_http_client.js:54:11) at exports.request (http.js:31:10) at TunnelingAgent.http.request (/home/droid/WebstormProjects/passport-social-master/http-proxy.js:36:15) at TunnelingAgent.createSocket (/home/droid/WebstormProjects/passport-social-master/node_modules/tunnel/lib/tunnel.js:116:25) at TunnelingAgent.createSecureSocket [as createSocket] (/home/droid/WebstormProjects/passport-social-master/node_modules/tunnel/lib/tunnel.js:188:41) at TunnelingAgent.addRequest (/home/droid/WebstormProjects/passport-social-master/node_modules/tunnel/lib/tunnel.js:80:8) at new ClientRequest (_http_client.js:139:16) at exports.request (http.js:31:10) at Object.http.request (/home/droid/WebstormProjects/passport-social-master/http-proxy.js:36:15) at Object.globalTunnel._defaultedAgentRequest (/home/droid/WebstormProjects/passport-social-master/node_modules/global-tunnel/index.js:211:38) at Object.exports.request (https.js:173:15) at Object.globalTunnel._defaultedAgentRequest (/home/droid/WebstormProjects/passport-social-master/node_modules/global-tunnel/index.js:211:38) at exports.OAuth._createClient (/home/droid/WebstormProjects/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) at exports.OAuth.getOAuthRequestToken (/home/droid/WebstormProjects/passport-social-master/node_modules/oauth/lib/oauth.js:542:8) at Strategy.OAuthStrategy.authenticate (/home/droid/WebstormProjects/passport-social-master/node_modules/passport-oauth1/lib/strategy.js:242:21)

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

ответ

0

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

Старой зависимость глобального туннеля. см. global-tunnel Issue #13

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


Это «старый» пост, но если кто-то имеет такую ​​же проблему:

Используйте случай:

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

Проблемы:

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

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

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

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

Использование глобального прокси-сервера (глобального туннеля или аналогичного) не будет выполнено потому что они перенаправляют все запросы, добавляя свой собственный агент (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); 
    }); 
});