2013-07-26 7 views
5

यह पहले से नहीं देखा गया है, क्योंकि क्लाइंट-सर्वर संचार के लिए, XHR (अभी तक) के माध्यम से प्रमाणीकरण की आवश्यकता नहीं है। कुछ एकीकरण परीक्षणों को लागू करने में, मैं एप्लिकेशन के वास्तविक उदाहरण के लिए वास्तविक अनुरोध node-xmlhttprequest बना रहा हूं। उपयोगकर्ता को पहले अनुरोध में प्रमाणित किया जा रहा है, और सिद्धांत रूप में उपयोगकर्ता का अद्वितीय पहचानकर्ता और कुछ अन्य प्रासंगिक जानकारी सत्र में संग्रहीत होती है (जैसा कि मैंने कहा है, यह वास्तविक ग्राहकों के लिए ठीक काम करता है, जिन्हें XHR पर उनकी पहचान की पुष्टि करने की आवश्यकता नहीं है)। किसी कारण से, भले ही बाद के अनुरोधों को उसी सत्र आईडी के साथ निकाल दिया जा रहा हो, फिर भी मैं बाद के अनुरोधों में सत्र को पुनः प्राप्त नहीं कर पा रहा हूं, और इस प्रकार यह नहीं देख सकता कि उपयोगकर्ता प्रमाणित है, और इससे असफल परीक्षण होते हैं जहां अपेक्षित व्यवहार नहीं होता है, और HTTP 401 unAUTHORIZED टर्मिनल भर रहा है।एक्सप्रेस.जेएस/पासपोर्ट ऐप अनुरोध हेडर में सत्र आईडी के बावजूद प्रत्येक अनुरोध के लिए नया सत्र बना रहा है

मैंने कुछ ऐसे प्रश्न देखे हैं जो इस तरह दिखते हैं, लेकिन "उसी सत्र आईडी" चीज उनके बीच मौजूद नहीं लगती है।

क्या मुझे सभी एक्सएचआर अनुरोधों में मैन्युअल रूप से सेट-कुकी हेडर जोड़ने की आवश्यकता है? यह भयानक है, एक बेहतर तरीका होना चाहिए!

तो स्रोत कोड जैसे लोगों, यहां परीक्षण से कुछ, इन अनुरोधों फायरिंग है:

// Ensure logged in before sending request, to verify that authorized 
// users encounter the expected behaviour. 
jQuery.post(domain+'/login', {email:'[email protected]', password:'12345678'}, 
function(data,x,y){ 
    data.should.equal("true") 
    jQuery.ajax({url:domain+'/event', type:"POST", 
    name: "TestEvent", location: "TestVille", 
    startDate: new Date('2013-09-01'), startTime: '6:45 pm', 
    description: "Test Event #1", success: state.success, 
    error: state.error, completed: state.completed 
    }) 
}) 

साइन इन करें), होता यूजर आईडी सत्र (`req.logIn (में लिखा जाता है ऐसा करने चाहिए, और यह किसी भी विफलताओं की रिपोर्ट नहीं करता है), उपयोगकर्ता आईडी का क्रमिकरण किसी भी विफलताओं की रिपोर्ट नहीं करता है, और मैं बेहद उलझन में हूं कि उसी सत्र आईडी का उपयोग करने वाले बाद के अनुरोध धारावाहिक उपयोगकर्ता आईडी को खोजने में असमर्थ क्यों हैं।

मैं आम तौर पर वेब विकास में शामिल नहीं हूं, इसलिए यह कुछ लोगों के लिए स्पष्ट हो सकता है, लेकिन मैं पूरे दिन एक उत्तर खोज रहा हूं और बस एक को खोजने में सक्षम नहीं हूं। मैं किसी भी पॉइंटर्स की सराहना करता हूं, और समस्या के बारे में बताते हुए, जितना मैं सक्षम हूं उतना कोड प्रदान करने में प्रसन्न हूं।

कोड है जो उचित हो सकता है के कुछ अतिरिक्त बिंदु:

क्रमबद्धता/यूजर आईडी (वर्तमान में सरल संभव तरीके से लागू की अक्रमांकन - यह बहुत मिडलवेयर की initiallization में जल्दबाजी होगी पासपोर्ट initiallizing के बाद और passpot.session() और यह पूरी तरह से अच्छी तरह से गैर एक्सएचआर अनुरोधों के लिए स्थानीय रणनीति के माध्यम से काम करता है) प्रयोक्ताओं की

// Serialize user for passport session-store 
// Currently only serializing 'user_id' 
passport.serializeUser(function(user, done) { 
    done(null, user._id) 
}) 

// Deserialize user from session-store to provide 
// access to the User instance 
passport.deserializeUser(function(id, done) { 
    User.findById(id, function(err, user) { 
    done(err, user) 
    }) 
}) 

प्रमाणीकरण:।

passport.use(new LocalStrategy({ 
    usernameField: "email", passwordField: "password", 
    passReqToCallback: true, failureFlash: true 
    }, 
    function(req, email, password, done) { 
    User.findByEmail(email, function(err, user) { 
     if(user) { 
     if(err) console.log(err) 
     if(user instanceof UserLocal) { 
      user.verifyPassword(password, function(err, match) { 
      if(err) console.log(err) 
      if(!match) { 
       return done(err, false, 
       "Username or password is incorrect.") 
      } 
      return done(null, user) 
      }) 
     } else { 
     var msg = "Account registered under " + user.providerName() 
       + ", please login using " + user.providerName() 
     return done(err, false, msg) 
     } 
    } else { 
     return done(err, false, "Username or password is incorrect.") 
    } 
    }) 
}) 

और अंत में अनुरोध जो पहली जगह में सत्र के लिए लिखें:

function loginHelper(req, res, next) { 
    passport.authenticate('local', { 
    failureFlash:true, 
    failureRedirect: false, 
    successRedirect: false 
    }, 
    function(err, user, info) { 
    req.logIn(user, function(err) { 
     if(!err) err = {} 
     if(req.xhr) { 
     console.log(req.session) 
     res.status(200).end(err.message || "true") 
     } else { 
     if(err.message) req.flash('error', err.message) 
     else res.redirect('/') 
     } 
    }) 
    })(req, res, next) 
} 

मुझे पता है कि 200 का एक स्थिति लॉगिन स्थिति की परवाह किए बिना भेजने जैसे कुछ अजीब बातें हैं, लेकिन मैं इस बात की पुष्टि कर सकते हैं कि धारावाहिक उपयोगकर्ता आईडी प्रारंभिक लॉगिन XHR अनुरोध पर सत्र में लिखा गया है, और यह बाद के एक्सएचआर अनुरोधों पर निराशाजनक नहीं है।

जैसा कि मेरा मानना ​​है कि मैंने उल्लेख किया है, मैं इस क्षेत्र में अपेक्षाकृत अनुभवहीन हूं, और बहुत अधिक बढ़ावा देने का उपयोग कर सकता हूं। किसी भी सहायता की बहुत सराहना की जाएगी, अग्रिम धन्यवाद।

+1

आप किसी भी समाधान मिला – Sushant

उत्तर

0

मुझे पहले

app.use(express.static(__dirname + '/public', { maxAge: oneDay })); 

और अद्यतन कार्यों में मदद यही कारण है कि पैदा नहीं करते डेटाबेस

passport.serializeUser((user, done) => { 
     var sessionUser = { id: user.dataValues.id, fio: user.dataValues.fio, email: user.dataValues.localemail, role: user.dataValues.role, login: user.dataValues.login, position: user.dataValues.position } 
     done(null, sessionUser) 
    }) 

    passport.deserializeUser((sessionUser, done) => { 
     // The sessionUser object is different from the user mongoose collection 
     // it's actually req.session.passport.user and comes from the session collection 
     done(null, sessionUser) 
    }) 

https://www.airpair.com/express/posts/expressjs-and-passportjs-sessions-deep-dive

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