Ich versuche Pass zu bekommen, um mit meinem Node Express Server zu arbeiten. Ich kann mich mit Facebook einloggen und den richtigen Benutzer in meiner Datenbank finden; Allerdings, wenn ich umadressiere req.user
ist immer undefiniert. Hier ist mein Server Code:req.user undefined - node + express + pass-facebook
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'));
});
Ich gehe zu/auth/facebook, es findet den richtigen Benutzer und leitet mich zu /. Aber dann gehe ich zu/Auth/user und req.user
ist nicht definiert und meine Sitzungen zeigen dies:
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',
Hat es etwas zu tun mit meinem sessionID die Sitzung nicht passender, wo der Pass Benutzer festgelegt ist?
aktualisieren
So stellte ich fest, dass die sessionID nicht war Matching, weil ich meinen Code auf c9.io laufen und es hat tatsächlich zwei URLs. Wenn ich die korrekte URL benutze und zu/auth/user gehe, stimmt meine SessionID mit der Sitzung mit Passbenutzer überein und ich sehe im log mein deserializeUser das korrekte Benutzerobjekt zu finden. Allerdings ist req.user
danach noch undefiniert.
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
dachte ich, das Problem. Es war in meiner user.findByID Funktion:
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);
});
};
geändert:
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);
});
};
Noch ein Hinweis: Vorsicht vor, um die Definition von Express-Strecken - wie auch immer, wenn Sie 'app.get' oder andere Route definieren. Da Sie Benutzerrouten vor Pass-Middleware definieren können, werden auf dieser Route auch keine Benutzerdaten angezeigt. (Es ist nicht spezifisch Ihr Fall, aber hat sehr ähnliche Symptome). – moka
so funktioniert es jetzt? posten Sie es als Antwort, wenn es so ist –
Ein praktisches Werkzeug ist das Kopieren und Einfügen Ihres Knotens in JSHint http://www.jshint.com Sie können auch eine Grunt-Aufgabe ausführen, damit JSHint Ihren Code sieht. –