2013-12-12 34 views
8

目前,我正在使用基於expressjs和使用passportjs(http://passportjs.org/)進行yammer身份驗證的sails框架。無論如何在passportjs中設置代理設置?

我在將公司代理服務器上的節點應用程序部署在服務器上時遇到問題。它無法連接到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中的某處配置它。

那麼,在passportjs中設置代理設置或在nodejs中解決此代理問題的任何好方法?

+0

我們需要更多的細節。你有什麼錯誤,它起源於哪裏?你能隔離相關代碼併發布它嗎?這是一個安全cookie的問題,並且問題僅在服務器位於代理後面時才顯示出來嗎?如果是這樣,並且您正在使用Express,請查看Express [docs](http://expressjs.com/api.html#app-settings)中的'trust proxy'設置。 –

+0

如果我可以繼續使用Express的假設,請查看[如何使用heroku + node.js + express設置安全cookie?](http://stackoverflow.com/questions/14463972/how-to-set -secure-cookie-using-heroku-node-js-express) –

+0

抱歉不清楚的問題。我會添加更多細節。加入了 –

回答

6

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流量使用env變量相同的http_proxy,但如果需要更改,代碼很容易遵循。

+0

爲什麼在'http.request'之前使用'var oldhttpreq = https.request''?我也得到了一個無限循環+ Maximium Stack Size Exceeded –

+0

@AndiGiga我們正在修改這個函數,我們需要保留對原始函數的引用。 –

+0

但是,爲什麼'var oldhttpreq = https.request;'not'var oldhttpreq = http.request;'http' vs'https' –