【问题标题】:How can I get Nodejs twitter-passport behind proxy?如何在代理后面获取 Nodejs twitter-passport?
【发布时间】:2016-03-17 12:29:12
【问题描述】:

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

InternalOAuthError:获取请求令牌失败 在 Strategy.OAuthStrategy._createOAuthError (/home/droid/WebstormProjects/passport-social-master/node_modules/passport-oauth1/lib/strategy.js:390:13) 在 /home/droid/WebstormProjects/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) 在 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) 在 Object.http.request (/home/droid/WebstormProjects/passport-social-master/http-proxy.js:36:15) 在 Object.globalTunnel._defaultedAgentRequest (/home/droid/WebstormProjects/passport-social-master/node_modules/global-tunnel/index.js:211:38) 在 Object.exports.request (https.js:173:15) 在 Object.globalTunnel._defaultedAgentRequest (/home/droid/WebstormProjects/passport-social-master/node_modules/global-tunnel/index.js:211:38) 在exports.OAuth._createClient (/home/droid/WebstormProjects/passport-social-master/node_modules/oauth/lib/oauth.js:256:20) 在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/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,但没有任何效果。所以我没有选择......

【问题讨论】:

    标签: node.js proxy passport-twitter


    【解决方案1】:

    您的问题

    对全局隧道的旧依赖。见global-tunnel Issue #13

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


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

    用例

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

    问题

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

    解决方案不起作用

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

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

    使用全局代理(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);
        });
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-27
      • 2017-11-02
      • 2011-11-14
      • 1970-01-01
      • 2017-08-23
      • 2018-07-26
      • 1970-01-01
      相关资源
      最近更新 更多