2013-12-12 12 views
8

वर्तमान में, मैं सेल फ्रेमवर्क का उपयोग कर रहा हूं जो एक्सप्रेसज पर आधारित है और पासपोर्टज (http://passportjs.org/) का उपयोग yammer प्रमाणीकरण करने के लिए करता है।वैसे भी पासपोर्टजे में प्रॉक्सी सेटिंग सेट करने के लिए?

मुझे कंपनी प्रॉक्सी के पीछे सर्वर पर मेरे नोड ऐप को तैनात करते समय समस्या है। यह OAuth2 प्रमाणीकरण के लिए yammer से कनेक्ट नहीं हो सकता है।

त्रुटि के रूप में अनुवर्ती है:

 
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) में सबकुछ सेट करने का प्रयास किया लेकिन लगता है कि कोड उन्हें स्वीकार नहीं करता है और इसके बजाय पासपोर्टजे में कहीं भी इसे कॉन्फ़िगर करने की आवश्यकता है।

तो, पासपोर्ट में प्रॉक्सी सेटिंग सेट करने या नोडजेस में इस प्रॉक्सी समस्या को हल करने का कोई अच्छा तरीका है?

+0

हमें और जानकारी चाहिए। आप क्या त्रुटि प्राप्त कर रहे हैं और यह कहां से उत्पन्न होता है? क्या आप प्रासंगिक कोड को अलग कर सकते हैं और इसे पोस्ट कर सकते हैं? क्या यह एक सुरक्षित कुकी के साथ एक समस्या है, और क्या समस्या केवल तब दिखाती है जब सर्वर प्रॉक्सी के पीछे होता है? यदि ऐसा है, और यदि आप एक्सप्रेस का उपयोग कर रहे हैं, तो एक्सप्रेस [डॉक्स] (http://expressjs.com/api.html#app-settings) में 'ट्रस्ट प्रॉक्सी' सेटिंग देखें। –

+0

यदि मैं इस धारणा के तहत जारी रख सकता हूं कि आप एक्सप्रेस का उपयोग कर रहे हैं, तो जांचें [कैसे हैकोकू + नोड.जेएस + एक्सप्रेस का उपयोग करके सुरक्षित कुकी सेट करें?] (Http://stackoverflow.com/questions/14463972/how-to-set -secure-cookie-use-heroku-node-js-express) –

+0

अस्पष्ट प्रश्न के लिए खेद है। मैं और विवरण जोड़ूंगा। –

उत्तर

6

Node.js डिफ़ॉल्ट रूप से http_proxy और https_proxy चर का उपयोग नहीं करता है।

आप अनुरोध के लिए agent पैरामीटर tweak करने के लिए है, लेकिन आप विश्व स्तर पर इस तरह बदल सकते हैं आपको लगता है कि पुस्तकालय पर नियंत्रण नहीं है के बाद से:

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

npm i tunnel --save 

एक setup_proxy.js बनाने

को बहुत शुरुआत require('./setup_proxy') पर इसकी आवश्यकता है।

ध्यान दें कि यह http और https ट्रैफ़िक के लिए समान http_proxy env चर का उपयोग करता है, लेकिन यदि आपको बदलने की आवश्यकता है तो कोड का पालन करना आसान है।

+0

'http.request' से पहले आप 'var oldhttpreq = https.request;' का उपयोग क्यों करते हैं?मुझे एक अनंत लूप भी मिलता है + 'मैक्सिमियम स्टैक साइज' –

+0

@AndiGiga हम फ़ंक्शन बंद कर रहे हैं और हमें मूल फ़ंक्शन का संदर्भ रखने की आवश्यकता है। –

+0

लेकिन 'वर oldhttpreq = https.request;' 'नहीं वर oldhttpreq = http.request;' 'http' बनाम' https' –

संबंधित मुद्दे