मैं अपने नोड एक्सप्रेस सर्वर के साथ काम करने के लिए पासपोर्ट प्राप्त करने का प्रयास कर रहा हूं। मैं फेसबुक के साथ लॉगिन कर सकता हूं और अपने डेटाबेस में सही उपयोगकर्ता ढूंढ सकता हूं; हालांकि, जब मैं 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);
});
};
एक और ध्यान दें: एक्सप्रेस रास्ते की परिभाषा के आदेश से सावधान - जब आप 'app.get' या किसी अन्य मार्ग को परिभाषित यह फर्क पड़ता है। चूंकि आप पासपोर्ट मिडलवेयर से पहले उपयोगकर्ता मार्ग को परिभाषित कर सकते हैं, इस तरह इस मार्ग में कोई उपयोगकर्ता डेटा भी नहीं होगा। (यह विशेष रूप से आपका मामला नहीं है, लेकिन इसमें बहुत समान लक्षण हैं)। – moka
तो यह अब काम करता है? अगर –
है तो इसे उत्तर के रूप में पोस्ट करें एक आसान टूल है जो अपने नोड को JSHint http://www.jshint.com में कॉपी और पेस्ट करना है। आप JSHint को अपना कोड देखने के लिए भी एक कंटेंट कार्य चला सकते हैं। –