目前,我正在使用基于expressjs和使用passportjs(
http://passportjs.org/)进行yammer身份验证的sails框架.
在公司代理服务器后面的服务器上部署我的节点应用程序时遇到问题.它无法连接到yammer进行OAuth2身份验证.
错误如下:
error: Failed to obtain access token (Error: connect ETIMEDOUT) at /root/rlps/node_modules/passport-yammer/node_modules/passport-oauth/lib/passport-oauth/strategies/oauth2.js:125:38 at /root/rlps/node_modules/passport-yammer/lib/passport-yammer/strategy.js:72:20 at ClientRequest. (/root/rlps/node_modules/passport-yammer/node_modules/passport-oauth/node_modules/oauth/lib/oauth2.js:129:5) at ClientRequest.EventEmitter.emit (events.js:95:17) at CleartextStream.socketErrorListener (http.js:1547:9) at CleartextStream.EventEmitter.emit (events.js:95:17) at Socket.onerror (tls.js:1437:17) at Socket.EventEmitter.emit (events.js:117:20) at net.js:441:14 at process._tickDomainCallback (node.js:459:13)
我相信这是因为代理阻止了这种方式.我试图在环境值中设置所有内容(如http_proxy和https_proxy),但似乎代码不承认它们,需要在passportjs的某个地方配置它.
解决方法
默认情况下,Node.js不使用http_proxy和https_proxy变量.
您必须调整请求的代理参数,但由于您无法控制该库,因此您可以像这样全局更改:
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,callback); };
在最开始需要这个(‘./ setup_proxy’).
请注意,这对http和https流量使用相同的http_proxy env变量,但如果需要更改,代码很容易理解.