2012-06-25 10 views
17

मैं एक्सप्रेस 2.x और सत्र भंडारण के साथ pssportjs का उपयोग कर रहा हूं। लॉगिन के बाद मुझे केवल एक बार req.User मिल रहा है। जैसे ही मैं फिर से रीडायरेक्ट करता हूं req.User अपरिभाषित है।पासपोर्टजेएस: मेरे विचारों में req.user कैसे प्राप्त करें

यहाँ मेरी config है:

app.get('/auth/facebook', passport.authenticate('facebook', { scope: ['user_status', 'user_photos'] })); 

app.get('/auth/facebook/callback', passport.authenticate('facebook', { successRedirect: '/index', failureRedirect: '/' })); 

app.get('/index', function(req, res) { 

      res.render('index.ejs', { 
       siteTitle: "Welcome", 
       siteUrl: CONFIG.server.siteUrl, 
       user: req.user 
      }); 
}); 

और अंत में यह कैसे मैं मेरे विचार में उपयोगकर्ता वस्तु का उपयोग करने की कोशिश कर रहा हूँ है:

<div class="page-header"> 
    <h3><%= siteTitle %></h3> 
</div> 

<% if (!user) { %> 
    <p>Not logged in !</p> 
<% } else { %> 
    <p>Hello, <%= user.firstname %> <%= user.lastname %>.</p> 
<% } %> 

passport.serializeUser(function(user, done) { 
    done(null, user._id); 
}); 

passport.deserializeUser(function(userId, done) { 
    User.findOne({_id: userId} ,function(err, user){ 
    done(err, user); 
    }); 
}); 

// Authentication Strategy 
passport.use(new FacebookStrategy({ 
    clientID: CONFIG.fb.appId, 
    clientSecret: CONFIG.fb.appSecret, 
    callbackURL: CONFIG.fb.callbackURL 
    }, 
    function(accessToken, refreshToken, profile, done) { 
    // asynchronous verification, for effect... 
    process.nextTick(function() { 

     User.findOne({ 'accounts.uid': profile.id, 'accounts.provider': 'facebook' }, function(err, olduser) { 

      if(olduser) { 
      done(null, olduser); 
      } else { 
      var newuser  = new User(); 
      var account  = {provider: "facebook", uid: profile.id}; 
      newuser.accounts.push(account); 
      newuser.firstname = profile.name.givenName; 
      newuser.lastname = profile.name.familyName; 
      newuser.email  = "TBD..."; 

      newuser.save(function(err) { 
       if(err) { throw err; } 
       done(null, newuser); 
      }); 
      } 
     }); 
    }); 
    } 
)); 

var app = module.exports = express.createServer(); 

// configure express 
app.configure(function(){ 
    app.set('views', __dirname + '/views'); 
    app.set('view engine', 'ejs'); 
    app.use(express.compiler({ src : __dirname + '/public', enable: ['less']})); 
    app.use(express.cookieParser()); 
    app.use(express.bodyParser()); 
    app.use(express.methodOverride()); 

    //app.use(express.session({ secret: "keyboard cat" })); 
    app.use(express.session({ 
    secret: "victory cat", 
    store: new MongoStore({ 
     url: CONFIG.dbMongo.url 
     }) 
    })); 
    app.use(passport.initialize()); 
    app.use(passport.session()); 
    app.use(app.router); 
    app.use(express.static(__dirname + '/public')); 
}); 

ये मेरी रास्ते हैं

फेसबुक के साथ प्रमाणीकरण के बाद मेरा विचार सही नाम और अंतिम नाम प्रदर्शित करता है। एक और पृष्ठ अनुरोध के बाद req.User undefiend है (deserializing invoced नहीं जा रहा है)।

मैं क्या गलत कर रहा हूं?

+2

अच्छा सवाल है। इससे बहुत मदद मिली :) –

+0

यह मूर्खतापूर्ण है कि इससे "आधिकारिक" दस्तावेज से अधिक मदद मिली है, डेवलपर्स को वास्तव में अपने काम को समझाने में अधिक समय लेना चाहिए। –

उत्तर

10

डायनामिक हेल्पर्स का उपयोग करें। यहाँ मेरी barebones user वस्तु का एक उदाहरण है:

app.dynamicHelpers({ 
    user: function(req, res){ 
     var roles, name; 

     if (req.session && req.session.auth == true) { 
      roles = ['member']; 
      name = (req.session.user) ? req.session.user.name : 'Registered member'; 
      id = (req.session.user) ? req.session.user.id : 0; 
     } 
     else { 
      roles = ['guest']; 
      name = 'Guest'; 
      id = null; 
     } 

     return { 
      name: name, 
      id: id, 
      roles: roles, 
      isGuest: roles.indexOf('guest') !== -1, 
      isAdmin: roles.indexOf('admin') !== -1 
     } 
    } 
}); 

फिर विचारों की वजह से आप बस #{user.name} या if user.isAdmin आदि के रूप में उपयोग कर सकते हैं वस्तु user अब एप्लिकेशन के अन्य भागों में पहुँचा जा सकता है।

आप इसे app.js में जोड़ सकते हैं या बाहरी फ़ाइल से आवश्यकता हो सकती है। मैं अपने सभी डायनामिक हेल्पर्स को /utils/helpers.js

2

के तहत पासपोर्ट मिडलवेयर सेट करता हूं?

गलती मैं: document से, आप set cookie secret instead of session secret

app.configure(function() { 
    app.use(express.cookieParser('keyboard cat')); 
    app.use(express.session()); 
    app.use(express.bodyParser()); 
    app.use(passport.initialize()); 
    app.use(passport.session()); 
    app.use(app.router); 
    app.use(express.static(YOUR_STATIC_DIR_PATH)); 
}); 
+0

मैं एक्सप्रेस 2.x का उपयोग कर रहा हूं और मैंने इसे ठीक तरह से कॉन्फ़िगर किया है (लेकिन एक मोंगो सत्र स्टोर के साथ)। मैं अपना प्रश्न अपडेट करने जा रहा हूं। क्या मैं 3.x व्यक्त करने के लिए अद्यतन करूँगा? – Sven

+0

मुझे यकीन नहीं है कि कौन सा संस्करण बेहतर है। मुझे लगता है कि नवीनतम संस्करण का उपयोग दिलचस्प और शैक्षिक है क्योंकि मैं देख सकता हूं कि टीजे रीयलटाइम में कार्यान्वयन में सुधार कैसे कर रहा है। – smagch

2

अगर आप एक्सप्रेस 3.x का उपयोग कर रहे

app.configure(function() { 
    app.use(express.cookieParser()); 
    app.use(express.bodyParser()); 
    app.use(express.session({ secret: 'keyboard cat' })); 
    app.use(passport.initialize()); 
    app.use(passport.session()); 
    app.use(app.router); 
    app.use(express.static(YOUR_STATIC_DIR_PATH)); 
}); 

करते हैं या 2.x कनेक्ट करें, सब ठीक है मैं समझ गया की जरूरत है मैंने ऊपर पोस्ट किए गए कोड में नहीं किया था, जो सही है। मेरे पास यूआरएल को जोड़ने का गलत तरीका था, इसलिए जब भी मैंने टूटे हुए लिंकों में से एक का इस्तेमाल किया तो मैंने किसी नए सत्र को बनाने के लिए अभिव्यक्त किया। नए सत्र के साथ मैंने अपना req.user ऑब्जेक्ट भी खो दिया।

तो यदि आपके पास समान समस्याएं हैं, तो अपने HTML के अंदर अपने लिंक भी देखें।

आपकी मदद के लिए सभी को धन्यवाद।

+1

क्या आप आगे बढ़ सकते हैं कि मैं अपने लिंक कैसे देख सकता हूं? –

0

आप रूटर में देखने के लिए उपयोगकर्ता की जानकारी पारित कर सकते हैं:

res.render('user/dashboad', { 
    ... 
    user: req.session.passport.user, 
    ... 
संबंधित मुद्दे