2013-02-19 17 views
29

Używam usługi Passport.js do logowania użytkownika przy użyciu nazwy użytkownika i hasła. Zasadniczo używam przykładowego kodu z witryny Passport. Oto odpowiednie części (jak sądzę) mojego kodu:Passport.js: jak uzyskać dostęp do obiektu użytkownika po uwierzytelnieniu?

app.use(passport.initialize()); 
app.use(passport.session()); 

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

passport.deserializeUser(function(obj, done) { 
    done(null, obj); 
}); 

passport.use(new LocalStrategy(function(username, password, done) { 
    User.findOne({ username: username }, function(err, user) { 
     if (err) { 
      return done(err); 
     } 
     if (!user) { 
      return done(null, false, { message: 'Incorrect username.' }); 
     } 
     if (!user.validPassword(password)) { 
      return done(null, false, { message: 'Incorrect password.' }); 
     } 
     return done(null, user); 
     }); 
    } 
)); 

app.post('/login', 
    passport.authenticate('local', { failureRedirect: '/login/fail', failureFlash: false }), 
    function(req, res) { 
     // Successful login 
     //console.log("Login successful."); 
     // I CAN ACCESS req.user here 
}); 

Wygląda na to, że poprawnie się loguje. Jednak chciałbym mieć dostęp do zasobów informacji logowania użytkownika w innych częściach kodu, takich jak:

app.get('/test', function(req, res){ 
    // How can I get the user's login info here? 
    console.log(req.user); // <------ this outputs undefined 
}); 

Sprawdziłem inne pytania na SO, ale nie jestem pewien, co robię źle tutaj. Dziękuję Ci!

Odpowiedz

5

Musisz się upewnić, że zarejestrowałeś middleware, który wypełnia req.session przed zarejestrowaniem middleware.

Na przykład następujący używa express cookieSession middleware

app.configure(function() { 

    // some code ... 

    app.use(express.cookieParser()); 
    app.use(express.bodyParser()); 
    app.use(express.cookieSession()); // Express cookie session middleware 
    app.use(passport.initialize()); // passport initialize middleware 
    app.use(passport.session());  // passport session middleware 

    // more code ... 

}); 
+51

Ten kod konfiguracji pomocy technicznej nie wskazuje, w jaki sposób użytkownik został ostatecznie pozyskany poza sesją. –

38

późno do partii, ale okazało się to bez odpowiedzi po googlowania odpowiedź siebie.

Wewnątrz żądania będzie obiekt req.user, który można wykonać z użyciem.

Trasy tak:

app.get('/api/portfolio', passport.authenticate('jwt', { session: false }), stocks.buy); 

sterownika tak:

buy: function(req, res) { 
     console.log(req.body); 
     //res.json({lel: req.user._id}); 
     res.json({lel: req.user}); 
    } 
+5

To powinna być właściwa odpowiedź, ponieważ bardziej bezpośrednio rozwiązuje problem ... W przypadku bezpaństwowego interfejsu REST API, to jest cay to go ... –

+1

Co się stanie, jeśli po zalogowaniu się w req.user pojawi się jako niezdefiniowany? – Aspen

1

W odniesieniu do Passport documentation, obiekt użytkownika znajduje się w req.user. Zobacz poniżej.

app.post('/login', 
     passport.authenticate('local'),function(req, res) { 
     // If this function gets called, authentication was successful. 
     // `req.user` contains the authenticated user. 
     res.redirect('/users/' + req.user.username); 
    }); 

W ten sposób można uzyskać dostęp do obiektu użytkownika ze strony, do której przekierowano.

Jeśli utkniesz, możesz odwołać się do my Github project, gdzie zaimplementowałem to wyraźnie.

+0

To jest dokładnie to, czego szukałem! Nigdy nie zorientowałem się, gdzie faktycznie uzyskać dostęp do req.user, a to wszystko doskonale podsumowuje. Dzięki! – Rahul

Powiązane problemy