如何在代理服务器后面获取Nodejs twitter-passport?

时间:2015-12-11 14:46:01

标签: node.js proxy passport-twitter

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

  

InternalOAuthError:无法获取请求令牌       在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       在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)       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:请求路径包含未转义的字符。       在新的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/tunnel.js:80:8)       在新的ClientRequest(_http_client.js:139:16)       在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)       在Strategy.OAuthStrategy.authenticate(/home/droid/WebstormProjects/passport-social-master/node_modules/passport-oauth1/lib/strategy.js:242:21)

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

1 个答案:

答案 0 :(得分:1)

您的问题

全球隧道中的旧依赖。见global-tunnel Issue #13

快速解决方案:将节点隧道依赖关系更新为0.0.4似乎最终无法正常工作,因为使用它会将所有请求重定向到Internet代理,而不仅仅是身份验证请求。

这是一个'旧'的帖子,但如果有人有类似的问题:

用例

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

问题

  • 默认情况下,NodeJ不会考虑任何系统代理设置
  • 公司代理不通过互联网代理转发内部请求(例如:如果设置了代理,所有请求都将转到互联网代理,而不再是内部网或本地主机)

解决方案无效

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

  • NodeJ忽略它们
  • 为所有请求设置代理,并且您只需要一个特定请求通过代理

使用全局代理(全局隧道或类似代理)将失败,因为它们会重定向添加自己的代理(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);
    });
});