2012-12-11 8 views
13

Próbuję uzyskać paszport do pracy z serwerem ekspresowym węzła. Mogę zalogować się za pomocą Facebooka i znaleźć właściwego użytkownika w mojej bazie danych; jednak po przekierowaniu req.user jest zawsze niezdefiniowany. Oto mój kod serwera:użytkownik nieokreślony - węzeł + ekspresowe + paszport-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')); 
}); 

idę do/auth/facebook, znajdzie właściwą użytkownika i przekierowuje mnie /. Ale potem przejść do/auth/użytkownika i req.user jest niezdefiniowany i moje sesje pokazać to:

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', 

Czy to ma coś wspólnego z moim sessionid nie pasujące sesję, w której użytkownik paszport jest ustawiony?

Aktualizacja

Więc uznałem, że sessionid nie pasujące dlatego używam mojego kodu na c9.io i faktycznie ma dwa adresy URL. Kiedy używam poprawnego adresu URL i przechodzę do/auth/user, mój identyfikator_sesji jest zgodny z sesją z zestawem użytkownika paszportu i widzę w dzienniku mój deserializeUser znajdujący poprawny obiekt użytkownika. Jednak po tym czasie req.user jest nadal niezdefiniowany.

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

zorientowali się problem. To było w mojej funkcji 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); 
    }); 
}; 

zmienione na:

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

Inna uwaga: uważaj kolejności definicji dróg ekspresowych - to nie ma znaczenia, jeśli zdefiniować 'app.get' lub jakąkolwiek inną trasą. Ponieważ możesz zdefiniować trasę użytkownika przed oprogramowaniem pośredniczącym w paszporcie, tak aby w tej trasie nie było również danych użytkownika. (Nie jest to konkretnie twój przypadek, ale ma bardzo podobne objawy). – moka

+2

, więc to działa teraz? post to odpowiedź, jeśli tak jest. –

+0

Poręcznym narzędziem jest skopiowanie i wklejenie twojego węzła do JSHint http://www.jshint.com Możesz również uruchomić zadanie pomruczania, aby JSHint mógł oglądać twój kod. –

Odpowiedz

1

Jak powiedział w aktualizacji było zmienna user._id nie jest w prawidłowym formacie. Aby tego uniknąć i musieć zająć się tym formatem później w innych żądaniach i metodach, doradzę ci przy generowaniu nowego identyfikatora użytkownika podczas rejestracji.

Można użyć tego modułu:

node-uuid

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

function findOrCreate(profile, callback) { 
    // save new profile 
    profile.uid = uuid.v1().replace(/\-/g, ''); 
} 
Powiązane problemy