Express SessionID不持久,没有浏览器cookie

时间:2015-01-27 17:11:48

标签: angularjs node.js cookies express

我尝试使用node,express和angular设置简单的护照登录。我没有让会话继续存在,我想因为它没有设置浏览器cookie,但为什么?

我的浏览器中没有设置cookie,每个请求节点识别的sessionID都不同。

这是使用Express 4,它与Exp3看起来非常不同。我认为它可能与middlware订购或会话存储配置有关。我试图逃避默认处理,我认为它是Exp4中的MemoryStore,但它似乎并没有起作用。

另外,我应该提到静态HTML / CSS由apache提供,而不是节点。 Node只是为API调用设置的。

以下是package.json中的相关行。

"dependencies": {
    "bcrypt-nodejs": "0.0.3",
    "body-parser": "^1.10.1",
    "connect-flash": "^0.1.1",
    "cookie-parser": "^1.3.3",
    "express": "^4.11.0",
    "express-session": "^1.10.1",
    "mongoose": "^3.8.21",
    "morgan": "^1.5.1",
    "passport": "^0.2.1"
  }

中间件设置

var express = require('express');
var morgan = require('morgan');
var mongoose = require('mongoose');
var passport = require('passport');
var flash    = require('connect-flash');
var app = express();

var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var session = require('express-session');

...

app.use(morgan('dev')); // log every request to the console
app.use(cookieParser()); // read cookies (needed for auth)

app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());

app.use(session({
  secret: 'DGUBJH7H6G6GTF5R53R54RSBH',
  resave: true,
  saveUninitialized: true
}));
app.use(passport.initialize());
app.use(passport.session());
app.use(flash());

app.use(function(req, res, next) {
  res.header("Access-Control-Allow-Origin", "*");
  res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
  next();
});

require('./config/routes.js')(app, passport);

路线

app.post('/login', passport.authenticate('local-login'), function(req, res) {
    var user = req.user;
    res.send(user);
  });
app.get('/user', isLoggedIn, function (req, res) {
    var user = req.user;
    res.send(user);
  });
function isLoggedIn(req, res, next) {
  var user = req.user;
  // if user is authenticated in the session, carry on
  if (req.isAuthenticated())
    return next();

  res.status(403).send();
}

我还可以使用序列化和反序列化功能发布护照代码,但我不确定它们是否与此相关。我只需要弄清楚为什么这段代码不能设置浏览器cookie!非常感谢任何帮助!

2 个答案:

答案 0 :(得分:0)

在这里,您只是设置会话但不设置cookie。所以,尝试设置cookie

// configuration
app.use(express.cookieParser());
// or  `express.cookieParser('secret')` for signed cookies

// routing
app.get('/foo', function (req, res) {
    res.cookie('bar', 'baz');
`});

app.get('/bar', function (req, res) {
    res.send(req.cookies.bar);
});

答案 1 :(得分:0)

所以这里的主要问题是我正在使用angular的$ http服务异步进行登录调用。似乎大多数浏览器不会根据异步请求的标头设置cookie。我将我的登录表单更改为直接指向我的节点登录回调,现在它重新加载页面以设置cookie,然后立即重定向到我的应用程序的主页面。