2012-11-29 26 views
7

मेरे पास वर्तमान में दो अलग-अलग बंदरगाहों पर दो अलग-अलग नोड ऐप्स चल रहे हैं लेकिन समान बैकएंड डेटा स्टोर साझा करते हैं। मुझे दो ऐप्स के बीच उपयोगकर्ता सत्र साझा करने की आवश्यकता है ताकि जब कोई उपयोगकर्ता एक ऐप के माध्यम से लॉग इन करता है, तो उनका सत्र उपलब्ध होता है और वे दूसरे ऐप में लॉग इन होते हैं। इस मामले में, यह 'एक सार्वजनिक सामना करने वाली वेबसाइट और एक प्रशासनिक बैकएंड है।नोड ऐप्स के बीच साझा सत्र?

  • एक्सप्रेस
  • पासपोर्ट के साथ नोड स्थानीय रणनीति के साथ प्रमाणन को संभालने के लिए
  • हम कनेक्ट-redis हमें redis के माध्यम से सत्र साझा करने के लिए अनुमति देने के लिए उपयोग कर रहे हैं इस्तेमाल किया जा रहा है:

    हमारे स्थापना निम्नलिखित है ।

  • हमारे डोमेन इस तरह दिखेगा: www.mydomain.com और adm.mydomain.com

सत्र सामान (और redis) के लिए दोनों क्षुधा के लिए एक ही है के लिए config:

session: { 
    options: { 
     secret: "my secret", 
     cookie: { 
      domain: "mydomain.com", 
      maxAge:1000*60*60*24 
     } 
    }, 
    redis: { 
     host: 'my host', 
     maxAge: 86400000, 
     secret: "my secret" 
    } 
} 

app.js में सत्र सामान के लिए config इस तरह दिखता है:

if (app.settings.env === "production") { 
    session.options.store = new RedisStore(session.redis); 
} 
app.use(express.session(session.options)); 
app.use(passport.initialize()); 
app.use(passport.session({ secret: 'a different secret' })); 

मैं इसे करने की उम्मीद क्या: हमें एक ही सेक्स को देखने के लिए अनुमति दें दो ऐप्स के बीच कुकी में आयन आईडी।

तो मेरा प्रश्न है: मैं एक्सप्रेस, रेडिस और पासपोर्ट कैसे स्थापित करूं ताकि आप विभिन्न सबडोमेन में सत्र साझा कर सकें?

+2

मुझे लगता है कि आप की जरूरत हो सकता है:

var Cookie = module.exports = function Cookie(options) { this.path = '/'; this.maxAge = null; this.httpOnly = true; if (options) merge(this, options); ... 

तो, कुछ इस तरह वर्तमान 1.10.1 मालिक के लिए काम करेंगे कुकी डोमेन को '" .mydomain.com "के रूप में निर्दिष्ट करने के लिए -' - 'अग्रणी 'नोट करें। –

+0

बिना "*" के? हमने कल एक परीक्षण में "* .mydomain.com" का इस्तेमाल किया था और यह काम नहीं कर रहा था। मैं इसे आज सुबह आज़मा दूंगा और देख सकता हूं कि परिणाम क्या है। – jpittman

+1

आपने '*' दर्ज किया है, है ना? उस मामले में, हाँ, बस प्रमुख बिंदु। मुझे लगता है कि यह एक कुकी को विभिन्न उप-डोमेन से पठनीय बनाता है। मुझे बताएं और मैं इसे एक उत्तर के रूप में आपूर्ति कर सकता हूं। –

उत्तर

4

शायद थोड़ा पुराना हो, लेकिन इस समय, एक्सप्रेस-सत्र कुकी के लिए डोमेन विकल्प को पहचान सकता है। स्रोत के अनुसार:

function session(options){ 
    var options = options || {} 
    // name - previously "options.key" 
    , name = options.name || options.key || 'connect.sid' 
    , store = options.store || new MemoryStore 
    , cookie = options.cookie || {} 
     ... 

और इस सेटिंग को कुकी के लिए है:

secret: "my secret", 
    cookie: { 
     domain: "mydomain.com", 
+0

सिर के लिए धन्यवाद। मैं अब परियोजना पर नहीं हूं और नोड सही मेयो में काम नहीं कर रहा हूं, लेकिन यह उत्कृष्ट खबर है। – jpittman

2

एक्सप्रेस-सत्र कुकीज के लिए "डोमेन" विकल्प को आपकी समस्या से पहचानने के लिए प्रतीत नहीं होता है। सत्र आईडी को संग्रहीत कुकी स्वचालित रूप से प्रत्येक ऐप के लिए डोमेन से जुड़ी होती है और इसलिए इसे साझा नहीं किया जा सकता है।

एक विकल्प वेबपैप्स में सत्र साझा करने के लिए अपना एकल-साइन-ऑन मॉड्यूल लिखना है। यह शायद निष्पादन आदेश में काफी जल्दी एक ऐप.यूज() घोषणा में रहेंगे और केवल एक अलग कुकी (जो क्रॉस-डोमेन होगा) बनायेगा, एक अलग एसएसओ सत्र आईडी बनाएं, और इस नई कुकी में एसएसओ आईडी स्टोर करें । इसके बाद, आप बस req.session और req.sso-session को आवश्यकतानुसार पार करते हैं।