2012-12-11 10 views
13

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); 
    }); 
}; 
+3

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

+2

so funktioniert es jetzt? posten Sie es als Antwort, wenn es so ist –

+0

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. –

Antwort

1

Wie Sie sagten in Sie aktualisieren es war die user._id Variable nicht in einem gültigen Format sein. Um dies zu vermeiden und später bei anderen Anfragen und Methoden auf dieses Format achten zu müssen, rate ich Ihnen, bei der Anmeldung eine neue Benutzerkennung zu generieren.

können Sie mit diesem Modul:

node-uuid

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

function findOrCreate(profile, callback) { 
    // save new profile 
    profile.uid = uuid.v1().replace(/\-/g, ''); 
} 
Verwandte Themen