Node.js 如何在代理后获得Nodejs twitter passport?

Node.js 如何在代理后获得Nodejs twitter passport?,node.js,proxy,passport-twitter,Node.js,Proxy,Passport Twitter,我正在使用passport twitter的nodejs模块测试twitter身份验证。我已经创建了我的Twitter应用程序,并配置了所有类似于Specified by tutorials的东西。问题是我在一个法人代理后面,据我所知,节点没有任何全局代理配置,也不尊重系统代理配置。这是我尝试使用twitter passport进行身份验证时得到的输出: InternalOAuthError:无法获取请求令牌 在Strategy.OAuthStrategy.\u创建OAutherror(/hom

我正在使用passport twitter的nodejs模块测试twitter身份验证。我已经创建了我的Twitter应用程序,并配置了所有类似于Specified by tutorials的东西。问题是我在一个法人代理后面,据我所知,节点没有任何全局代理配置,也不尊重系统代理配置。这是我尝试使用twitter passport进行身份验证时得到的输出:

InternalOAuthError:无法获取请求令牌 在Strategy.OAuthStrategy.\u创建OAutherror(/home/droid/webstorprojects/passport-socialmaster/node\u modules/passport-oauth1/lib/Strategy.js:390:13) at/home/droid/webstoreprojects/passport社交主机/node_modules/passport-oauth1/lib/strategy.js:244:40 at/home/droid/websport/socialmaster/node_modules/oauth/lib/oauth.js:543:17 在ClientRequest。(/home/droid/websport/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) 在进程中调用(node.js:366:17)

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

var globalTunnel = require('global-tunnel');
globalTunnel.initialize({
  host: 'proxy.example.com',
  port: 8080
});
在这种情况下,我得到的只是以下信息:

TypeError:请求路径包含未转义字符。 在新的客户端请求中(_http_client.js:54:11) at exports.request(http.js:31:10) 在TunnelingAgent.http.request(/home/droid/webstoreprojects/passport-socialmaster/http-proxy.js:36:15) 在TunnelingAgent.createSocket(/home/droid/webstoreprojects/passport-socialmaster/node_-modules/tunnel/lib/tunnel.js:116:25) 在TunnelingAgent.createSecureSocket[作为createSocket](/home/droid/webstorprojects/passport social master/node_modules/tunnel/lib/tunnel.js:188:41) 在TunnelingAgent.addRequest(/home/droid/webstoreprojects/passport-socialmaster/node_-modules/tunnel/lib/tunnel.js:80:8) 在新的客户端请求中(_http_client.js:139:16) at exports.request(http.js:31:10) 在Object.http.request(/home/droid/webstoreprojects/passport-socialmaster/http-proxy.js:36:15) 在Object.globalTunnel.\u defaultdAgentRequest(/home/droid/webstorprojects/passport social master/node\u modules/global tunnel/index.js:211:38) at Object.exports.request(https.js:173:15) 在Object.globalTunnel.\u defaultdAgentRequest(/home/droid/webstorprojects/passport social master/node\u modules/global tunnel/index.js:211:38) 在exports.OAuth._createClient(/home/droid/webstoreprojects/passport social master/node_modules/OAuth/lib/OAuth.js:256:20) 在exports.OAuth.\u performSecureRequest(/home/droid/webstoreprojects/passport social master/node\u modules/OAuth/lib/OAuth.js:371:19) 在exports.OAuth.getOAuthRequestToken(/home/droid/webstoreprojects/passport social master/node_modules/OAuth/lib/OAuth.js:542:8) 在Strategy.OAuthStrategy.authenticate(/home/droid/webstoreprojects/passport-socialmaster/node_modules/passport-oauth1/lib/Strategy.js:242:21)


我也尝试了Shaun Xu的半全局代理()。我在任何地方都导入了修改过的require.js,但没有任何效果。所以我没有选择…

你的问题

全球隧道中的旧依赖。看

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


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

用例

  • 服务器位于internet代理之后
  • 服务器通过http/https访问本地资源,例如不能通过代理请求的elasticsearch服务器
  • 您将passportJs与身份验证模块一起使用,witch需要外部令牌验证,例如google on
问题

  • 默认情况下,NodeJs不考虑任何系统代理设置
  • 公司代理不通过internet代理转发内部请求(例如:如果设置了代理,则所有请求都将转到internet代理,而不再在intranet或localhost中)
解决方案不起作用

设置系统环境HTTP\U代理或HTTPS\U代理不起作用,原因有二:

  • nodej忽略它们
  • 为所有请求设置代理,并且您只希望一个特定请求通过代理
使用全局代理(全局隧道或类似)将失败,因为它们重定向所有请求并添加自己的代理(request.options.Agent),从而将所有流量转发到代理。不需要

解决方案

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

我已成功实施并测试了此解决方案:请参阅

用法示例:

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);
    });
});