2012-12-11 15 views
13

मैं अपने नोड एक्सप्रेस सर्वर के साथ काम करने के लिए पासपोर्ट प्राप्त करने का प्रयास कर रहा हूं। मैं फेसबुक के साथ लॉगिन कर सकता हूं और अपने डेटाबेस में सही उपयोगकर्ता ढूंढ सकता हूं; हालांकि, जब मैं req.user को पुनर्निर्देशित करता हूं तो हमेशा अनिर्धारित होता है।req.user अपरिभाषित - नोड + एक्सप्रेस + पासपोर्ट-फेसबुक

var express = require('express'), 
path = require('path'), 
http = require('http'), 
passport = require('passport'), 
FacebookStrategy = require('passport-facebook').Strategy, 
user = require('./routes/users'); 


var app = express(); 

passport.use(new FacebookStrategy({ 
    clientID: "HIDDEN", 
    clientSecret: "HIDDEN", 
    callbackURL: "http://MYURL.com/auth/facebook/callback", 
    passReqToCallback: true 
}, 
    function(req, accessToken, refreshToken, profile, done) { 
    user.findOrCreate(profile, function(err, user) {  
     if (err) { return done(err); }  
     done(null, user); 
    });  
    } 
)); 

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

passport.deserializeUser(function(id, done) { 
    user.findById(id, function(err, user) { 
    done(err, user); 
    }); 
}); 

app.configure(function() {  
app.set('port', process.env.PORT || 3000); 
    app.use(express.static(path.join(__dirname, 'public'))); 
    app.use(express.logger('dev')); /* 'default', 'short', 'tiny', 'dev' */ 
    app.use(express.bodyParser()); 
    app.use(express.cookieParser()); 
    app.use(express.session({ secret: 'foobar' })); 
    app.use(passport.initialize()); 
    app.use(passport.session()); 
    app.use(app.router);  
}); 

app.get('/auth/user', function (req, res) { 
    console.log(req); 
}); 

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


http.createServer(app).listen(app.get('port'), function() { 
    console.log("Express server listening on port " + app.get('port')); 
}); 

मैं जाने के लिए/प्रमाणन/फेसबुक, यह सही उपयोगकर्ता पाता है और/करने के लिए मुझे पुनर्निर्देश: यहाँ अपने सर्वर कोड है। लेकिन तब मैं/प्रमाणन/उपयोगकर्ता के लिए जाने के लिए और req.user अपरिभाषित है और मेरे सत्र यह दिखाने:

cookies: { 'connect.sid': 's:JFdQkihKQQyR4q70q7h2zWFt.VS+te0pT0z/Gtwg7w5B33naCvA/ckKMk60SFenObxUU' }, 
    signedCookies: {}, 
    url: '/auth/user', 
    method: 'GET', 
    sessionStore: 
    { sessions: 
     { '5sk3Txa2vs5sYhvtdYwGaUZx': '{"cookie":{"originalMaxAge":null,"expires":null,"httpOnly":true,"path":"/"},"passport":{"user":"50c527c9c6cb41860b000001"}}', 
     'Au6m0hAj/3warKOGNSWw0yu2': '{"cookie":{"originalMaxAge":null,"expires":null,"httpOnly":true,"path":"/"},"passport":{}}', 
     JFdQkihKQQyR4q70q7h2zWFt: '{"cookie":{"originalMaxAge":null,"expires":null,"httpOnly":true,"path":"/"},"passport":{}}' }, 
    generate: [Function], 
    _events: { disconnect: [Function], connect: [Function] } }, 
    sessionID: 'JFdQkihKQQyR4q70q7h2zWFt', 

यह मेरी sessionID सत्र जहां पासपोर्ट उपयोगकर्ता सेट कर दिया जाता मिलान नहीं के साथ क्या करने के लिए कुछ है?

अद्यतन

तो मैं निर्धारित किया है कि sessionID नहीं क्योंकि मैं c9.io पर अपने कोड चल रहा हूँ और यह वास्तव में दो URL हैं मिलान किया गया था। जब मैं सही यूआरएल का उपयोग करता हूं और/auth/user पर जाता हूं तो मेरा सत्र आईडी पासपोर्ट उपयोगकर्ता सेट के साथ सत्र से मेल खाता है और मैं लॉग में देख सकता हूं कि मेरे deserializeUser सही उपयोगकर्ता ऑब्जेक्ट को ढूंढ रहा है। हालांकि, req.user इसके बाद भी अनिर्धारित है।

Trying to find user with id: 50c527c9c6cb41860b000001 
{ sessions: 
    { yoOUOxyXZ0SmutA0t5xUr6nI: '{"cookie":{"originalMaxAge":null,"expires":null,"httpOnly":true,"path":"/"},"passport":{"user":"50c527c9c6cb41860b000001"}}', 
    goZpmK3y3tOfn660hRbz2hSa: '{"cookie":{"originalMaxAge":null,"expires":null,"httpOnly":true,"path":"/"},"passport":{}}', 
    'O5Sz1GuZqUO8aOw4Vm/hriuC': '{"cookie":{"originalMaxAge":null,"expires":null,"httpOnly":true,"path":"/"},"passport":{}}' }, 
    generate: [Function], 
    _events: { disconnect: [Function], connect: [Function] } } 
sessionID: yoOUOxyXZ0SmutA0t5xUr6nI 
req.user: undefined 
{ cookie: 
    { path: '/', 
    _expires: null, 
    originalMaxAge: null, 
    httpOnly: true }, 
    passport: {} } 

Update2

मैं इस समस्या पता लगा। यह मेरी user.findByID समारोह में किया गया था:

exports.findById = function(id, callback) {  
    console.log('Trying to find user with id: ' + id); 
    db.collection('users').findOne({'_id':id}, function(err, user) {   
      callback(err, user); 
    }); 
}; 

करने के लिए बदल:

exports.findById = function(id, callback) {  
    console.log('Trying to find user with id: ' + id); 
    db.collection('users').findOne({'_id':new BSON.ObjectID(id)}, function(err, user) {   
      callback(err, user); 
    }); 
}; 
+3

एक और ध्यान दें: एक्सप्रेस रास्ते की परिभाषा के आदेश से सावधान - जब आप 'app.get' या किसी अन्य मार्ग को परिभाषित यह फर्क पड़ता है। चूंकि आप पासपोर्ट मिडलवेयर से पहले उपयोगकर्ता मार्ग को परिभाषित कर सकते हैं, इस तरह इस मार्ग में कोई उपयोगकर्ता डेटा भी नहीं होगा। (यह विशेष रूप से आपका मामला नहीं है, लेकिन इसमें बहुत समान लक्षण हैं)। – moka

+2

तो यह अब काम करता है? अगर –

+0

है तो इसे उत्तर के रूप में पोस्ट करें एक आसान टूल है जो अपने नोड को JSHint http://www.jshint.com में कॉपी और पेस्ट करना है। आप JSHint को अपना कोड देखने के लिए भी एक कंटेंट कार्य चला सकते हैं। –

उत्तर

1

जैसा कि आपने कहा आप अद्यतन में यह user._id चर एक मान्य प्रारूप में नहीं किया जा रहा था। इससे बचने के लिए और बाद में अन्य अनुरोधों और विधियों में इस प्रारूप का ख्याल रखना है, मैं आपको साइनअप पर एक नया उपयोगकर्ता आईडी उत्पन्न करने के लिए सलाह दूंगा।

आप इस मॉड्यूल का उपयोग कर सकते हैं:

node-uuid

var uuid = require('node-uuid'); 

function findOrCreate(profile, callback) { 
    // save new profile 
    profile.uid = uuid.v1().replace(/\-/g, ''); 
} 
संबंधित मुद्दे