Express Passport.js不保留会话中的用户对象

我有一个运行在端口3000上的Express应用程序。前端运行在端口80上,所以这是一个CORS应用程序。 用户存储在SQL服务器数据库中。 我使用护照作为本地策略的authentication方法,以及快速会话中间件。 该应用程序是一个单页面应用程序,发送到服务器的所有请求都通过ajax完成。 用户在页面上login并且发送证书,并且如果validation成功,则用户ID以及用户名和FullNmae应该被保持到会话。

我有很多这样的错误:最重要的是,login后,快递保存使用护照的用户名和其他数据到一个新的会话,并返回一个HTML片段,以取代页面上的身体标记。 但是,为了testing用户对象是否存在,我调用/ create-user路由,它说用户对象不在那里。 此外,新的会话开始于每个请求(我检查日志,并看到每次显示不同的会话ID)。 不仅如此,在某一时刻,我能够在浏览器中看到会话cookie,但是我再也看不到它了。 我试图回到我可以看到cookie的地步,但仍然没有出现!

我已经把我的头几个小时,不知道为什么deserializeUser没有被调用,为什么数据不被持久。 我哪里错了?

注意:一些明显的代码省略(app.listen(),require语句等)

/* ------ CONFIGURATIONS ------ */ const app = express(); const mssqlConfig = JSON.parse(fs.readFileSync("mssql-config.json", "utf8")); passport.use(new LocalStrategy( function loginAuthentication(username, password, done) { let connPool = new mssql.ConnectionPool(mssqlConfig); connPool.connect(error => { if (error) {console.log(error); return done(error);} ps = new mssql.PreparedStatement(connPool); ps.input('username', mssql.NVarChar(20)); ps.input('password', mssql.NVarChar(50)); ps.prepare('SELECT FullName, fldLoginName, fldEmployeeID, fldPassword FROM tblEmployees WHERE fldLoginName = @username AND fldPassword = @password;', error => { if (error) {console.log(error); return done(error);} ps.execute({username, password}, (error, result) => { if (error) {console.log(error); return done(error);} console.log(result); if (result.recordset.length == 0) { return done(null, false, {message: "There is no user with those credentials!"}); } else if (result.recordset[0].fldLoginName != username || result.recordset[0].fldPassword != password) { return done(null, false, {message: "Username or password is incorrect!"}) } else { return done(null, { ID: result.recordset[0].fldEmployeeID, username: result.recordset[0].fldLoginName, fullName: result.recordset[0].FullName }); } ps.unprepare(error => console.log(error)); }); }); }); } )); passport.serializeUser((user, done) => { done(null, JSON.stringify(user)); }) passport.deserializeUser((user, done) => { console.log(user); done(null, JSON.parse(user)); }); /* ----- MIDDLEWARE ------ */ app.use(function allowCrossDomain(request, response, next) { // CORS // intercept OPTIONS method response.header('Access-Control-Allow-Credentials', true); response.header('Access-Control-Allow-Origin', request.headers.origin); response.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE'); response.header('Access-Control-Allow-Headers', 'X-Requested-With, X-HTTP-Method-Override, Content-Type, Accept'); response.header('Access-Control-Max-Age', '60'); if ('OPTIONS' == request.method) { response.sendStatus(200); } else { next(); } }); app.use(bodyParser.json()); app.use(session({ secret:"long string of characters", name:'officetools-extensions', saveUninitialized:false, resave:false, cookie:{secure:false, httpOnly:true, maxAge:86400000, domain:"http://officetools-extensions"}, store: new MemoryStore({checkPeriod:86400000}) })); app.use(passport.initialize()); app.use(function checkRestrictedURL(request, response, next){ console.log(request.url); if (!request.url.match(/^\/login$/g)) { console.log("passed"); passport.session()(request, response, next); } else { next(); } }); /* ------ ROUTES ------ */ app.post('/login', bodyParser.urlencoded({extended:false}), (request, response, next) => { passport.authenticate('local', {session:true}, (error, user, info) => { if (error) { error.status = 500; return next(error); } if (info) { let err = new Error(info.message); err.status = 400; return next(err);} if (!user) { return response.status(401).send("User could not be logged in!"); } console.log(request.sessionID); console.log(user); console.log(request.session); request.logIn(user, function loginCallBack(error) { if (error) { error.status = 500; return next(error);} console.log("after login", request.session); console.log(request.isAuthenticated()); return response.sendFile(path.join(__dirname + "/templates/barcodes.html")); }) })(request, response, next); }); app.get("/current-user", (request, response, next) => { console.log(request.user, request.session); console.log(request.sessionID); console.log(request.isAuthenticated()); if (request.user) { response.header("Content-Type", "application/json"); return response.send(request.user); } else { return response.status(401).send("There is no user currently logged in!"); } }); 

我想到了。 我只需要删除会话设置的域属性。 这使它的工作。

Interesting Posts