如何保持用户login? ExpressJS和护照有可能吗?

我有一个服务器在node.js使用快递和护照passport-local策略的passport-local

我有数据库中的用户,通过护照我能够validation他们,不幸的是,当第二个请求来自同一个客户端req.isAuthenticated()方法返回false 。 请求中也没有用户( req.user = undefined )。

我也检查过,当进行身份validation,虽然我从passport.authenticate('local'...取回用户passport.authenticate('local'...我没有得到req.user填充然后,如果我尝试手动设置它只是不传播以下请求。

我不明白我做错了什么,这是我的代码。

server.js

 var express = require('express'), compass = require('node-compass'), routes = require('./server/routes') http = require('http'), path = require('path'), passport = require('passport'), LocalStrategy = require('passport-local').Strategy, Database = require('./server/repositories/database'), Configuration = require('./server/config').Config, crypto = require('crypto'); var app = express(); app.enable("jsonp callback"); passport.use(new LocalStrategy( function(email, password, done) { process.nextTick(function () { var userService = new UserService(); userService.login(email, crypto.createHash('md5').update(password).digest("hex"), function(error, user) { if (error) done(error, user); else if (!user) return done(null, false, { message: 'wrong credentials'}); return done(null, user); }); }); } )); passport.serializeUser(function(user, done) { done(null, user._id); }); passport.deserializeUser(function(id, done) { var userService = new UserService(); userService.findById(id, function(err, user) { done(err, user); }); }); app.configure(function(){ app.set('port', Configuration.Port); app.set('views', __dirname + '/app/views'); app.set('view engine', 'ejs'); app.use(express.favicon()); app.use(express.logger('dev')); app.use(express.cookieParser()); app.use(express.bodyParser()); app.use(express.methodOverride()); app.use(compass({ project: path.join(__dirname, 'app'), sass: 'styles' })); app.use(express.session({ secret: 'keyboard cat' })); app.use(function(err, req, res, next){ console.error(err.stack); res.send(500, 'Something broke!'); }); app.use(passport.initialize()); app.use(passport.session()); app.use(app.router); app.use(express.static(path.join(__dirname, 'app'))); }); routes.configure(app); Database.open(function() { app.listen(Configuration.Port, function() { console.log("Express server listening on port " + Configuration.Port); }); }); 

routes.js

 var Configuration = require('./config').Config; var ApiResult = require('../model/apiResult').ApiResult; var ApiErrorResult = require('../model/apiErrorResult').ApiErrorResult; var ApiReturnCodes = require('../model/apiReturnCodes').ApiReturnCodes; var passport = require('passport'); var usersController = require('./controllers/usersController'); exports.configure = function(app) { function ensureAuthenticated(req, res, next) { console.log(req.isAuthenticated()); if (req.isAuthenticated()) { return next(); } else {res.send(new ApiErrorResult(ApiReturnCodes.NOT_LOGGED_IN, null));} } app.post('/login', function(req, res, next) { passport.authenticate('local', function(err, user, info) { if (err || !user) { console.log(info); res.send(new ApiErrorResult(ApiReturnCodes.ENTITY_NOT_FOUND, null)); } // If this function gets called, authentication was successful. // `req.user` contains the authenticated user else res.send(new ApiResult(user)); })(req,res,next); }); app.get('/anotherLink', ensureAuthenticated, function(req, res, next) { res.json({Code:0}); }); } 

当我通过身份validation后点击链接/anotherLink ,我将res.isAuthenticated()为false。

另外,当我看到在req.session之后的ensureAuthenticated ,我得到:

 { cookie: { path: '/', _expires: null, originalMaxAge: null, httpOnly: true }, passport: {} } 

我错过了什么来保存该用户通过身份validation的信息? 在客户端,我正在使用Angular只使用不带参数的url进行简单的获取。

如果我忘了在这里写一些东西,告诉我,我会更新它。 任何帮助将不胜感激。 谢谢

所以我发现我的代码有什么问题。

我的passport.deserializeUser方法使用了userService.findById方法

那叫库…就这样:

 userRepository.findUnique({"_id": id}, callback); 

因为这个id是由MongoDB生成的,所以正确的调用需要是:

 userRepository.findUnique({"_id": new ObjectID(id)}, callback); 

我希望这会节省一些时间给下一个有同样问题的人。

有了这个细节,这个代码应该很好地适用于每个想在Passport框架中使用LocalStrategy的人。