2013-02-19 4 views
29

Я использую Passport.js для входа в систему с именем пользователя и паролем. Я использую код примера с сайта Passport. Вот соответствующие части (я думаю) моего кода:Passport.js: как получить доступ к объекту пользователя после аутентификации?

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

Это похоже на правильность входа. Тем не менее, я хотел бы быть в состоянии получить доступ к информации самого пользователя в других частях кода, такие как:

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

Я проверил другие вопросы на SO, но я не уверен, что я делаю здесь неправильно. Спасибо!

ответ

5

Вам необходимо убедиться, что вы зарегистрировали middleware, который заполняет req.session, прежде чем регистрировать проездные документы паспорта.

Например следующее использует 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

Этот код настройки поддержки не указывает, как пользователь, наконец, был получен из сеанса. –

38

Late к партии, но нашел это без ответа после того, как прибегая к помощи ответ сам.

Внутри запроса будет req.user объект, с которым вы можете работать.

Маршруты, так как:

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

контроллера так:

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

Это должен быть правильный ответ, поскольку он более непосредственно затрагивает проблему ... В случае API-интерфейса REST без состояния, это будет cay to go ... –

+1

Что делать, если после входа в req.user отображается как неопределенное? – Aspen

1

Со ссылкой на Passport documentation, объект пользователя содержится в req.user. Смотри ниже.

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

Таким образом, вы можете получить доступ к своему пользовательскому объекту со страницы, на которую вы перенаправляете.

В случае, если вы застряли, вы можете обратиться к my Github project, где я его четко выполнил.

+0

Это именно то, что я искал! Я никогда не выяснял, где на самом деле получить доступ к req.user, и это прекрасно подводит итог. Благодаря! – Rahul

Смежные вопросы