Express SessionID 不持久,没有浏览器cookie
Express SessionID not persistent, no browser cookie
我正在尝试使用 node、express 和 angular 设置一个简单的护照登录。我无法让会话持续存在,我想是因为它没有设置浏览器 cookie,但为什么呢?
我的浏览器没有设置cookie,每次请求node识别的sessionID都不一样
这是使用 Express 4,它似乎与 Exp3 有很大不同。我认为这可能与中间件排序或会话存储配置有关。我正在尝试摆脱默认处理,我认为这是 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();
}
我也可以 post 具有序列化和反序列化功能的护照代码,但我不确定它们是否与此相关。我只需要弄清楚为什么这段代码没有设置浏览器 cookie!任何帮助将不胜感激!
这里只是设置了session,没有设置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);
});
所以对我来说这里的主要问题是我正在使用 angular 的 $http 服务异步进行登录调用。似乎大多数浏览器不会根据异步请求的 header 设置cookie。我更改了我的登录表单以直接指向我的节点登录回调,现在它重新加载页面以设置 cookie,然后立即重定向到我的应用程序的主页。
我正在尝试使用 node、express 和 angular 设置一个简单的护照登录。我无法让会话持续存在,我想是因为它没有设置浏览器 cookie,但为什么呢?
我的浏览器没有设置cookie,每次请求node识别的sessionID都不一样
这是使用 Express 4,它似乎与 Exp3 有很大不同。我认为这可能与中间件排序或会话存储配置有关。我正在尝试摆脱默认处理,我认为这是 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();
}
我也可以 post 具有序列化和反序列化功能的护照代码,但我不确定它们是否与此相关。我只需要弄清楚为什么这段代码没有设置浏览器 cookie!任何帮助将不胜感激!
这里只是设置了session,没有设置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);
});
所以对我来说这里的主要问题是我正在使用 angular 的 $http 服务异步进行登录调用。似乎大多数浏览器不会根据异步请求的 header 设置cookie。我更改了我的登录表单以直接指向我的节点登录回调,现在它重新加载页面以设置 cookie,然后立即重定向到我的应用程序的主页。