【问题标题】:Anyway to set proxy setting in passportjs?无论如何要在passportjs中设置代理设置?
【发布时间】:2016-03-21 20:26:22
【问题描述】:

目前,我正在使用基于 expressjs 的sails 框架,并使用passportjs(http://passportjs.org/) 进行yammer 身份验证。

在公司代理后面的服务器上部署我的节点应用程序时遇到问题。它无法连接到 yammer 进行 OAuth2 身份验证。

错误如下:

错误:获取访问令牌失败(错误:连接 ETIMEDOUT) 在 /root/rlps/node_modules/passport-yammer/node_modules/passport-oauth/lib/passport-oauth/strategies/oauth2.js:125:38 在 /root/rlps/node_modules/passport-yammer/lib/passport-yammer/strategy.js:72:20 在客户端请求。 (/root/rlps/node_modules/passport-yammer/node_modules/passport-oauth/node_modules/oauth/lib/oauth2.js:129:5) 在 ClientRequest.EventEmitter.emit (events.js:95:17) 在 CleartextStream.socketErrorListener (http.js:1547:9) 在 CleartextStream.EventEmitter.emit (events.js:95:17) 在 Socket.onerror (tls.js:1437:17) 在 Socket.EventEmitter.emit (events.js:117:20) 在 net.js:441:14 在 process._tickDomainCallback (node.js:459:13)

我相信这是因为代理挡住了路。我尝试在环境值中设置所有内容(如 http_proxy 和 https_proxy),但似乎代码不承认它们,需要在 passportjs 中的某个地方进行配置。

那么,在passportjs中设置代理设置或在nodejs中解决这个代理问题有什么好的方法吗?

【问题讨论】:

  • 我们需要更多细节。你得到什么错误,它起源于哪里?能不能把相关代码隔离出来贴出来?这是安全 cookie 的问题吗?问题是否仅在服务器位于代理后面时显示?如果是这样,并且如果您使用的是 Express,请查看 Express docs 中的 trust proxy 设置。
  • 如果我可以继续假设您使用的是 Express,请查看 How to set secure cookie using heroku + node.js + express?
  • 抱歉问题不清楚。我会添加更多细节。
  • 已添加!如果还有什么不清楚的地方,请指出。
  • 我现在通过查看 passport-yammer 库代码明白了。它不提供通过代理发送请求。希望有一种简单的方法可以为节点应用程序设置全局代理,而无需在 passport-yammer 库中进行修复。

标签: node.js express proxy sails.js passport.js


【解决方案1】:

Node.js 默认不使用http_proxyhttps_proxy 变量。

您必须为请求调整 agent 参数,但由于您无法控制该库,您可以像这样全局更改:

npm i tunnel --save

创建一个 setup_proxy.js:

var env = process.env;

if (!env['http_proxy']) return;

var localUrls = [
  'http://some-internal-url.mycompany.local',
];

var url    = require('url');
var tunnel = require('tunnel');
var proxy = url.parse(env['http_proxy']);

var tunnelingAgent = tunnel.httpsOverHttp({
  proxy: {
    host: proxy.hostname,
    port: proxy.port
  }
});

var https = require('https');
var http = require('http');

var oldhttpsreq = https.request;
https.request = function (options, callback) {

  if (localUrls.some(function (u) {
    return ~u.indexOf(options.host);
  })){
    return oldhttpsreq.apply(https, arguments);
  }

  options.agent = tunnelingAgent;
  return oldhttpsreq.call(null, options, callback);
};

var oldhttpreq = http.request;
http.request = function (options, callback) {

  if (localUrls.some(function (u) {
    return ~u.indexOf(options.host);
  })){
    return oldhttpreq.apply(http, arguments);
  }

  options.agent = tunnelingAgent;
  return oldhttpreq.call(null, options, callback);
};

一开始就需要这个require('./setup_proxy')

请注意,这对 http 和 https 流量使用相同的 http_proxy env 变量,但如果您需要更改代码,则很容易遵循。

【讨论】:

  • 为什么在http.request之前使用var oldhttpreq = https.request;?我也得到一个无限循环 + Maximium Stack Size Exceeded
  • @AndiGiga 我们正在猴子修补函数,我们需要保留对原始函数的引用。
  • 但是为什么 var oldhttpreq = https.request; 不是 var oldhttpreq = http.request; http vs https
  • 也不是requires singeltons,只要它们在index.js 的子模块中不需要?所以它无论如何都不是原来的功能?
  • 明白了!感谢您指出了这一点。 “不需要单例吗?”,这些只是对象并被缓存。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-12
相关资源
最近更新 更多