1

我正在使用 passport-twitter 的 nodejs 模块测试 twitter auth。我已经创建了我的 Twitter 应用程序并配置了教程中指定的所有内容。问题是我在一个公司代理后面,据我所知,节点没有任何全局代理配置,也不尊重系统代理配置。这是我尝试使用 twitter-passport 进行身份验证时得到的输出:

InternalOAuthError:无法在 /home/droid/WebstormProjects 的 Strategy.OAuthStrategy._createOAuthError (/home/droid/WebstormProjects/passport-social-master/node_modules/passport-oauth1/lib/strategy.js:390:13) 处获取请求令牌/passport-social-master/node_modules/passport-oauth1/lib/strategy.js:244:40 在 /home/droid/WebstormProjects/passport-social-master/node_modules/oauth/lib/oauth.js:543:17 在客户端请求。(/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)。

到目前为止,我已尝试使用以下方法设置全局隧道:

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

在这种情况下,我得到的只是这条消息:

TypeError:请求路径包含未转义的字符。在 TunnelingAgent.http.request (/home/droid/WebstormProjects/passport-social-master/http-proxy.js 的 export.request (http.js:31:10) 的新 ClientRequest (_http_client.js:54:11) :36:15) 在 TunnelingAgent.createSecureSocket [as createSocket] (/home/droid/WebstormProjects/passport-social-master/node_modules/tunnel/lib/tunnel.js:116:25) 的 TunnelingAgent.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/tunnel.js :80:8) 在新的 ClientRequest (_http_client.js:139:16) 在 Export.request (http.js:31:10) 在 Object.http.request (/home/droid/WebstormProjects/passport-social-master/ http代理。

我也尝试了 Shaun Xu 的半全局代理(http://blog.shaunxu.me/archive/2013/09/05/semi-global-proxy-setting-for-node.js.aspx)。我在任何地方都导入了修改后的 require.js,但没有任何效果。所以我越来越没有选择...

4

1 回答 1

1

你的问题

对全球隧道的旧依赖。见全球隧道问题 #13

快速解决方案:将节点隧道依赖项更新到 0.0.4 最后似乎不起作用,因为使用它将所有请求重定向到 Internet 代理而不是仅身份验证请求。


这是一个“旧”帖子,但如果有人遇到类似问题:

用例

  • 服务器位于 Internet 代理后面
  • 服务器通过 http/https 访问本地资源,例如不能通过代理请求的 elasticsearch 服务器
  • 您正在使用带有身份验证模块的 passportJs,需要外部令牌验证,例如https://accounts.google.com上的 google

问题

  • 默认情况下,NodeJs 不考虑任何系统代理设置
  • 公司代理不通过 Internet 代理转发内部请求(例如:如果设置了代理,所有请求都将转到 Internet 代理,不再在 Intranet 或 localhost 中)

解决方案不起作用

设置系统环境 HTTP_PROXY 或 HTTPS_PROXY不起作用有两个原因:

  • NodeJs 忽略它们
  • 为所有请求设置了代理,您只希望一个特定的请求通过代理

使用全局代理(global-tunnel 或类似的)将失败,因为它们重定向所有请求添加自己的代理(request.options.agent),因此会将您的所有流量转发到您的代理。不想要。

一个解决方案

使用与 global-tunnel 类似的代码,添加白名单以仅代理某些主机名。

我已经成功实施并测试了这个解决方案:见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);
    });
});
于 2016-09-30T13:31:29.667 回答