浏览器要求登录持久性.用户(node.js, mean.io)



我遵循教程"用MEAN Stack构建AngularJS和Node.js应用程序",并坚持使用"04。在页面刷新之间持续登录。mp4"

如本教程所述,某些中间件函数必须console.log req。用户对象。但这并没有发生。

包。json的依赖关系:

"body-parser": "~1.0.2",
"cookie-parser": "^1.1.0",
"express": "~4.1.2",
"express-session": "^1.1.0",
"jade": "~1.3.1",
"mongoose": "~3.8.9",
"morgan": "~1.0.1",
"passport": "^0.2.0",
"passport-local": "^1.0.0",
"serve-favicon": "~2.0.0",
"stylus": "~0.44.0"

server.js(全)

'use strict';
var express = require('express');
var env = process.env.NODE_ENV = process.env.NODE_ENV || 'development';
var app = express();
var mongoose = require('mongoose');
var passport = require('passport');
var LocalStrategy = require('passport-local').Strategy;

var config = require('./server/config/config')[env];
require('./server/config/express')(app, config);
require('./server/config/mongoose')(config);
var User = mongoose.model('User');

passport.use(new LocalStrategy(function(username, password, done) {
  User.findOne({username: username}).exec(function(error, user) {
    if(error) { return done(error); }
    if(user && user.authenticate(password)) {
      return done(null, user);
    } else {
      return done(null, false);
    }
  });
}));
// !!!! this middleware must console.log req.user, but it is always undefined.
// req.session displays and seems like correct
app.use(function(req, res, next) {
//  console.log(req.session);
  console.log(req.user);
  next();
});

passport.serializeUser(function(user, done) {
  if(user) {
    done(null, user._id);
  }
});
passport.deserializeUser(function(id, done) {
  User.findOne({_id: id}).exec(function(error, user) {
    if(!user) {
      return done(null, false);
    }
    return done(null, user);
  });
});


require('./server/config/routes')(app);

app.listen(config.port);
console.log('listening on port ' + config.port + '...');

express.js(全)

'use strict';
var express = require('express');
var stylus = require('stylus');
var logger = require('morgan');
var body_parser = require('body-parser');
var cookie_parser = require('cookie-parser');
var session = require('express-session');
var passport = require('passport');
var favicon = require('serve-favicon');

module.exports = function(app, config) {
  app.set('views', config.root_path + '/server/views');
  app.set('view engine', 'jade');
  function compile(str, path){
    return stylus(str).set('filename', path);
  }
  app.use(stylus.middleware({
    src: config.root_path + '/public',
    compile: compile
  }));
  app.use(logger());
  app.use(cookie_parser('multi vision unicorns'));
  app.use(session({ secret: 'keyboard cat', key: 'sid', cookie: { secure: true }}));
  app.use(body_parser());
  app.use(passport.initialize());
  app.use(passport.session());
  app.use(express.static(config.root_path + '/public'));
  app.use(favicon(config.root_path + '/public/favicon.ico'));

// development
// =   =   =   =   =   =   =   =   =   =   =   =
  if ('development' === app.get('env')) {
    app.locals.pretty = true;
  }
};

我现在可以通过POST使用护照模块登录,但是刷新页面后,登录状态没有保持,我需要重新登录。在教程中说,这个中间件

app.use(function(req, res, next) {
  console.log(req.user);
  next();
});

必须console.log用户对象,即使刷新页面。但事实并非如此。

本课的最终目标,是保持浏览器的登录状态,使登录后字段"username","password",按钮"Sign In"隐藏,刷新后保持隐藏。但似乎服务器也没有保持登录状态。可能是会话问题,也可能是其他问题。

请帮. .

= = = = = = = =

问题解决了,-必须删除"cookie: {secure: true}"部分:"app.use(session({secret: 'secret', key: 'sid', cookie: {secure: true}}));"因为它只适用于https

我认为您需要存储会话。(以CoffeeScript为例)

session = require 'express-session'
mongoStore = (require 'connect-mongo') session
app.use session
  secret: 'super secret'
  store: new mongoStore(db: 'session')
  cookie:
    secure: true
    maxAge: 2592000000

最新更新