2013-06-24 4 views
6

क्या पासपोर्ट.जेएस को कई नोड.जेएस उदाहरणों पर तैनात करते समय सत्र एफ़िनिटी की आवश्यकता होती है? जब मैं सत्र संबंध को नियोजित कर रहा हूं तो प्रमाणीकरण कई उदाहरणों (लोड बैलेंसर के पीछे) के साथ ठीक से काम करता है। मैं सत्र स्टोर के रूप में redis का उपयोग कर रहा हूँ। हालांकि, सत्र एफ़िनिटी का उपयोग नहीं करते समय passport.js नीचे दी गई त्रुटि के साथ विफल रहा है। एक उदाहरण के साथ यह हमेशा काम करता है। पासपोर्ट.जेएस सत्र सत्र के बिना काम करने का कोई तरीका है।क्या पासपोर्ट.जेएस को कई नोड.जेएस उदाहरणों पर तैनात करते समय सत्र एफ़िनिटी की आवश्यकता होती है

500 Failed to verify assertion (message: Invalid association handle) 

    at Strategy.authenticate.identifier (node_modules/passport-google/node_modules/passport-openid/lib/passport-openid/strategy.js:184:36) 
    at _verifyAssertionData (node_modules/passport-google/node_modules/passport-openid/node_modules/openid/openid.js:1053:12) 
    at _verifyAssertionAgainstProvider (node_modules/passport-google/node_modules/passport-openid/node_modules/openid/openid.js:1178:14) 
    at _checkSignatureUsingAssociation (node_modules/passport-google/node_modules/passport-openid/node_modules/openid/openid.js:1229:14) 
    at Object.openid.loadAssociation (node_modules/passport-google/node_modules/passport-openid/node_modules/openid/openid.js:111:5) 
    at _checkSignatureUsingAssociation (node_modules/passport-google/node_modules/passport-openid/node_modules/openid/openid.js:1221:10) 
    at _checkSignature (node_modules/passport-google/node_modules/passport-openid/node_modules/openid/openid.js:1211:5) 
    at _verifyAssertionAgainstProvider (node_modules/passport-google/node_modules/passport-openid/node_modules/openid/openid.js:1174:3) 
    at _verifyDiscoveredInformation node_modules/passport-google/node_modules/passport-openid/node_modules/openid/openid.js:1145:16) 
    at openid.discover (node_modules/passport-google/node_modules/passport-openid/node_modules/openid/openid.js:668:7) 

कोड स्निपेट का उपयोग कर पासपोर्ट:

app.set('port', process.env.PORT || 8080); 
app.set('views', __dirname + '/views'); 
app.set('view engine', 'ejs'); 
app.use(express.favicon()); 
app.use(express.logger('dev')); 
app.use(express.query()); 
app.use(express.bodyParser()); 
app.use(express.methodOverride()); 
app.use(express.cookieParser()); 
app.use(express.session({ key: 'JSESSIONID', secret: '****', cookie : {httpOnly:false, 
    maxAge: 5*60*1000, path: '/'}, 
    store: new RedisStore({ prefix: 'sid:', client: redisClient }) 
        })); 
app.use(passport.initialize()); 
app.use(passport.session()); 
app.use(app.router); 
app.use(express.static(path.join(__dirname, 'public'))); 
app.get('/auth/google', passport.authenticate('google')); 
app.get('/auth/google/return', 
     passport.authenticate('google', { successRedirect: '/success', 
             failureRedirect: '/login' })); 

मैं भी serializeUser और deserializeUser है redis दुकान का उपयोग करता है स्टोर करने के लिए/उपयोगकर्ता वस्तु पुनः प्राप्त - लेकिन जब पहचान प्रदाता को वापस पुनर्निर्देश इस त्रुटि हो रहा है कॉलबैक यूआरआई। मैं ऐपफॉग में अपना ऐप तैनात कर रहा हूं और JSESSIONID कुकी कुंजी का उपयोग करके सत्र एफ़िनिटी सेट कर रहा हूं (इस तरह क्लाउडफाउंड्री लोड बैलेंसर्स काम करता है)। अगर मैं किसी अन्य कुंजी का उपयोग करता हूं (जिसका मतलब है कि सत्र संबंध बंद है) तो त्रुटि passport.js द्वारा फेंक दी जाती है।

+0

आप बिना किसी संबंध के दौड़ने में सक्षम होना चाहिए। मुझे लगता है कि यह मदद करेगा अगर हम देख सकते हैं कि आप सत्रों को स्टोर और साझा करने के लिए रेडिस का उपयोग कैसे कर रहे हैं। कोड की प्रासंगिक रेखाएं मदद कर सकती हैं। –

+0

मैंने कोड स्निपेट के साथ-साथ स्थिति की कुछ और संक्षिप्त व्याख्या भी जोड़ दी है। किसी भी सहायता की सराहना की जाएगी। – jrajp2184

+0

एक और महत्वपूर्ण नोट: फेसबुक और ट्विटर प्रदाता सत्र एफ़िनिटी के बिना ठीक काम कर रहे हैं (वे दोनों ओएथ का उपयोग करते हैं)। समस्या Google ऑथ (ओपनआईडी) के साथ होती है। कभी-कभी यह Google के साथ काम करता है - लेकिन मुझे लगता है कि जब मूल अनुरोध और रीडायरेक्ट दोनों एक ही उदाहरण से संसाधित होते हैं। – jrajp2184

उत्तर

7

मुझे लगता है कि मैंने इसे ठीक कर दिया है। एक विकल्प है: 'स्टेटलेस' जिसे GoogleStrategy को पास किया जा सकता है। मैंने स्रोत को देखकर इसे समझ लिया: https://github.com/jaredhanson/passport-openid/blob/master/lib/passport-openid/strategy.js। इसलिए GoogleStrategy इन्स्टेन्शियशन होना चाहिए:

new GoogleStrategy({ 
    returnURL: BASE + '/auth/google/return', 
    realm: BASE + "/", 
    stateless: true 
} 

जारेड हैन्सन के लिए धन्यवाद इस तरह के एक विकल्प लागू करने के लिए! (उम्मीद है कि यह मुख्य साइट पर दस्तावेज होगा)।

+0

यह हेरोकू पर एक बहु-डायनो ऐप के साथ सहायक था। मुझे मोंगो का एक सत्र स्टोर के रूप में उपयोग करने में एक ही त्रुटि मिल रही थी। – tbeseda

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

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