PassportJS:如何在我的意见中得到req.user

我使用Express 2.x和会话存储使用pssportjs。 login后,我得到req.User只有一次。 只要我redirectreq.User是不确定的。

这是我的configuration:

passport.serializeUser(function(user, done) { done(null, user._id); }); passport.deserializeUser(function(userId, done) { User.findOne({_id: userId} ,function(err, user){ done(err, user); }); }); // Authentication Strategy passport.use(new FacebookStrategy({ clientID: CONFIG.fb.appId, clientSecret: CONFIG.fb.appSecret, callbackURL: CONFIG.fb.callbackURL }, function(accessToken, refreshToken, profile, done) { // asynchronous verification, for effect... process.nextTick(function () { User.findOne({ 'accounts.uid': profile.id, 'accounts.provider': 'facebook' }, function(err, olduser) { if(olduser) { done(null, olduser); } else { var newuser = new User(); var account = {provider: "facebook", uid: profile.id}; newuser.accounts.push(account); newuser.firstname = profile.name.givenName; newuser.lastname = profile.name.familyName; newuser.email = "TBD..."; newuser.save(function(err) { if(err) { throw err; } done(null, newuser); }); } }); }); } )); var app = module.exports = express.createServer(); // configure express app.configure(function(){ app.set('views', __dirname + '/views'); app.set('view engine', 'ejs'); app.use(express.compiler({ src : __dirname + '/public', enable: ['less']})); app.use(express.cookieParser()); app.use(express.bodyParser()); app.use(express.methodOverride()); //app.use(express.session({ secret: "keyboard cat" })); app.use(express.session({ secret: "victory cat", store: new MongoStore({ url: CONFIG.dbMongo.url }) })); app.use(passport.initialize()); app.use(passport.session()); app.use(app.router); app.use(express.static(__dirname + '/public')); }); 

这些是我的路线:

 app.get('/auth/facebook', passport.authenticate('facebook', { scope: ['user_status', 'user_photos'] })); app.get('/auth/facebook/callback', passport.authenticate('facebook', { successRedirect: '/index', failureRedirect: '/' })); app.get('/index', function(req, res) { res.render('index.ejs', { siteTitle: "Welcome", siteUrl: CONFIG.server.siteUrl, user: req.user }); }); 

最后这就是我想要访问我的视图中的用户对象:

 <div class="page-header"> <h3><%= siteTitle %></h3> </div> <% if (!user) { %> <p>Not logged in !</p> <% } else { %> <p>Hello, <%= user.firstname %> <%= user.lastname %>.</p> <% } %> 

在用Facebook进行身份validation之后,我的视图正确显示名字和姓氏。 在另一个页面请求req.User未定义之后(反序列化没有被调用)。

我究竟做错了什么?

使用dynamic助手。 下面是我的准系统user对象的一个​​例子:

 app.dynamicHelpers({ user: function(req, res){ var roles, name; if (req.session && req.session.auth == true) { roles = ['member']; name = (req.session.user) ? req.session.user.name : 'Registered member'; id = (req.session.user) ? req.session.user.id : 0; } else { roles = ['guest']; name = 'Guest'; id = null; } return { name: name, id: id, roles: roles, isGuest: roles.indexOf('guest') !== -1, isAdmin: roles.indexOf('admin') !== -1 } } }); 

然后从视图中,您可以简单地使用#{user.name}或者if user.isAdmin等作为对象user现在可以访问该应用程序的其他部分。

您可以将其添加到app.js或从外部文件中获取。 我将所有的dynamic帮助程序保存在/utils/helpers.js下

你有没有设置护照中间件? 从文件中 ,你需要做的

 app.configure(function() { app.use(express.cookieParser()); app.use(express.bodyParser()); app.use(express.session({ secret: 'keyboard cat' })); app.use(passport.initialize()); app.use(passport.session()); app.use(app.router); app.use(express.static(YOUR_STATIC_DIR_PATH)); }); 

如果您正在使用Express 3.x或Connect 2.x,请设置Cookie秘密,而不是会话密钥

 app.configure(function() { app.use(express.cookieParser('keyboard cat')); app.use(express.session()); app.use(express.bodyParser()); app.use(passport.initialize()); app.use(passport.session()); app.use(app.router); app.use(express.static(YOUR_STATIC_DIR_PATH)); }); 

好吧,我明白了:

我所做的错误不在我上面的代码中,这是正确的。 我有一个错误的方式链接到URL,所以我不知何故强迫expression创build一个新的会话,每次我使用了一个断开的链接。 随着新的会议,我也失去了我的req.user对象。

所以,如果你有类似的问题,也检查你的链接在你的HTML。

感谢大家的帮助。

您可以传递用户信息在路由器中查看:

 res.render('user/dashboad', { ... user: req.session.passport.user, ...