从Passport策略路由中传递用户信息

我正在尝试使用express来validation用户使用passportjs。

Passport.js看起来像这样。

var USER_INFO = {}; var FB_CALLBACK = 'http://localhost:3000/auth/facebook/callback'; module.exports = function(passport) { passport.use(new FacebookStrategy({ clientID: FB_CLIENT_ID, clientSecret: FB_CLIENT_SECRET, callbackURL: FB_CALLBACK }, function(accessToken, refreshToken, profile, done) { process.nextTick(function() { USER_INFO.id = profile.id; }); })); } 

 var express = require('express'); // call express var app = express(); // define our app using express var router = express.Router(); // get an instance of the express Route var passport = require('passport'); USER_INFO = {}; require('./config/passport')(passport); app.get('/auth/facebook', passport.authenticate('facebook')); app.get('/auth/facebook/callback', passport.authenticate('facebook', { successRedirect : '/fb', failureRedirect : '/error' })); app.get('/fb', function (req, res) { res.json(USER_INFO); }); 

我想要res.json(user_info)中提取的所有信息。 但它是空的。 我在这里错过了什么。 什么是最好的方法来保存用户的基本信息,以保持他login。

首先,您不应该将USER_INFO = {}存储在当前请求的范围之外。 如果两个单独的用户发出请求,那么他们会得到相同的对象。

你至less应该以一种可以单独检索它们的方式来存储它们

 var USERS = {}; ... module.exports... passport.use... ... function(accessToken, refreshToken, profile, done) { USERS[profile.id] = profile; done(null, profile); })); 

现在,如果两个单独的用户提出请求,他们将把他们的信息单独存储在USERS

 { 1234: {id: 1234, name: FOO}, 6789: {id: 6789, name: BAR}, } 

done(null, profile)serialize该用户。 如果你还没有定义你的序列化/反序列化函数,你应该这样做:

 passport.serializeUser(function (user, done) { done(null, user.id); }); passport.deserializeUser(function (id, done) { var user = USERS[id]; done(null, user); }); 

现在,您的用户将作为req.user在其各自的请求上下文中req.user

所以你只需要做:

 app.get('/fb', function (req, res) { res.json(req.user); }); 

process.nextTick()中忘记调用完成 ()。

 var FB_CALLBACK = 'http://localhost:3000/auth/facebook/callback'; module.exports = function(passport) { passport.use(new FacebookStrategy({ clientID: FB_CLIENT_ID, clientSecret: FB_CLIENT_SECRET, callbackURL: FB_CALLBACK }, function(accessToken, refreshToken, profile, done) { process.nextTick(function() { var USER_INFO = {}; USER_INFO.id = profile.id; done(USER_INFO) }); })); } 

你可以传递任何对象到done() ,它会在你的路由中成为req.user 。 在你的情况下,你想要响应的USER_INFOreq.user

 app.get('/fb', function (req, res) { res.json(req.user); });