我的问题是与此类似one,但没有深入了解他的解决方案。
我使用的护照使用Instagram的要权威性。成功验证后,用户被定向到“/”。在这一点上,要求有用户对象(也就是它的工作)。但是,一旦我重定向,该req.user是不确定的。 :'(
奇数部分是passport.deserializeUser被调用与每个请求。它成功地获取用户对象,而是沿着公路中间件某处,req.user没有被设置(或取消设置存在)。
// on successful auth, goto "/"
app.get('/', function(req, res) {
// if the request has the user object, go to the user page
if (req.user) {
res.redirect("/user/" + req.user._id);
}
res.render("index");
}
app.get('/user/:uid', function(req, res) {
console.log(req.user) // undefined
}
你有你的应用程序建立的会话状态?你需要像这样...
app.use(session({ secret: 'anything' }));
app.use(passport.initialize());
app.use(passport.session());
一旦你有你的快递会话建立确保你有护照连载和反序列化,在反序列化功能时被产生req.user那。从另一个计算器问题见解释here。
passport.serializeUser(function(user, done) {
done(null, user);
});
passport.deserializeUser(function(user, done) {
done(null, user);
});
当U在客户端使用的HTTP请求,记得附上证书。在Angular2您需要添加选项参数:{withCredentials:真}。在此之后,你将有相同req.sessionID,直到你再次重置。
this._http.get("endpoint/something", { withCredentials: true })
如果你的中间件堆栈还不清楚,假设你有会话中间件的地方,你可以保存重定向前会议:
if (req.user) {
req.session.save(function (err) {
if (err) {
// ... panic!
}
res.redirect("/user/" + req.user._id);
});
return;
}
您是否尝试过在你的cookieParser到秘密密钥插入?
var passport = require('passport');
var expressSession = require('express-session');
app.use(express.static(path.join(__dirname, 'public')));
app.use(cookieParser('mySecretKey'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(expressSession({
secret: 'mySecretKey',
resave: false,
saveUninitialized: true
}));
app.use(passport.initialize());
app.use(passport.session());
有完全相同的问题。对我来说,解决方案是使用的,而不是“表达会话”。也许坏会话配置“客户端会话”?
不工作的代码:
var session = require('express-session');
app.use(bodyParser.urlencoded({ extended: false }));
app.use(express.static(path.join(__dirname, 'public')));
app.use(cookieParser());
app.use(bodyParser.json());
app.use(session({
secret: 'random string',
resave: true,
saveUninitialized: true,
cookie: { secure: true }
}));
工作代码:
var session = require('client-sessions');
app.use(bodyParser.urlencoded({ extended: false }));
app.use(express.static(path.join(__dirname, 'public')));
app.use(cookieParser());
app.use(bodyParser.json());
app.use(session({
cookieName: 'session',
secret: 'random string',
duration: 30 * 60 * 1000,
activeDuration: 5 * 60 * 1000,
}));
我有同样的问题,都与req.isAuthenticated()和req.user,这里是我如何解决
app.use(session(...));
app.use(passport.initialize());
app.use(passport.session());
// Now we can access req.user so after we will call req.user, if we write it above these, it will always return underfined
app.use(function(req, res, next){
res.locals.user = req.user || null
next();
})
见,如果你passport.session()
后访问req.user,如果不低于添加您的路线。
虽然这样做passport.authenticate
您可以添加session: true
来解决此问题:
app.post("/login", passport.authenticate('local', {
'failureRedirect': '/login',
'session': true
}), (req, res)=>{ res.redirect("/"); });
我的是从所有这些不同的。我之前已经开发localhost上一个WordPress站点,然后切换到一个单独的节点/项目作出反应。
从WordPress本站的cookie仍然存在,并因为这两个项目在本地主机上运行被发送。这是导致该问题。
我不得不清除localhost上的cookie,然后它的工作。
我的两分钱:不工作的代码:
server.use(
session({
secret: "secretsssss",
rolling: false,
resave: false,
saveUninitialized: false,
cookie: {
sameSite: true, //this line
maxAge: 60 * 60 * 1000
}
})
);
工作代码:
server.use(
session({
secret: "secretsssss",
rolling: false,
resave: false,
saveUninitialized: false,
cookie: {
sameSite: false, // i think this is default to false
maxAge: 60 * 60 * 1000
}
})
);
当您验证用户,请求值req.user
被填满。要知道,如果识别用户和填充值,则使用一个Cookie。如果你像我一样配置与安全cookie的会话,饼干将只提供了HTTPS
,这是不是标准配置,让我们说,一个本地开发服务器。有超过HTTP
Cookie的工作,注释掉cookie: { secure: true }
和req.user
值将被正确配置:
this.app.use(session({
resave: true,
saveUninitialized: true,
secret: process.env.SESSION_SECRET || "a secret",
// cookie: { secure: true },
}));
如果合理,你只能在生产想跟HTTPS
饼干,你可以这样做:
cookie: { secure: process.env.ENV === 'PRODUCTION' }
我的问题尚未指定使用获取的客户端时发送的cookie。它包含证书后的工作:“包括”字段的请求。
fetch('/api/foo', {credentials: 'include'})
服务器发送的setcookie头然后在浏览器手柄来存储它,然后该cookie与对Cookie的HTTP头内同一服务器发出的请求发送。
我必须设置withCredentials:真正的在我的客户端。 (axios.js)
const config = {
withCredentials: true,
headers: {
'Content-Type': 'application/json',
},
};
axios.put(url, { page: '123' }, config)
.then(res => console.log('axios', res))
.catch(err => console.log('axios', err));
然后发生CORS问题。
所以我说这我Express服务器:
app.use(function(req, res, next) {
res.header('Access-Control-Allow-Credentials', true);
res.header('Access-Control-Allow-Origin', req.headers.origin);
res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE');
res.header('Access-Control-Allow-Headers', 'X-Requested-With, X-HTTP-Method-Override, Content-Type, Accept');
if ('OPTIONS' == req.method) {
res.send(200);
} else {
next();
}
});
我有一个不同的问题,一些与bcrypt节点和箭头的功能。
该工作代码:
userSchema.methods.generateHash = function (password) {
return bcrypt.hashSync(password, bcrypt.genSaltSync(8), null);
};
userSchema.methods.isValidPassword = function (password) {
return bcrypt.compareSync(password, this.password);
};
不工作的代码:
userSchema.methods.generateHash = (password) => {
return bcrypt.hashSync(password, bcrypt.genSaltSync(8), null);
};
userSchema.methods.isValidPassword = (password) => {
return bcrypt.compareSync(password, this.password);
};
我是超级新节点,但它是一个中间件的问题对我来说。新增bodyParser并重新安排来解决。
断码:
app.use(express.cookieParser('secret'));
app.use(express.cookieSession());
app.use(express.session({ secret: 'anything' }));
app.use(passport.initialize());
app.use(passport.session());
app.use(app.router);
app.use(express.static(path.join(__dirname, 'public')));
工作守则:
app.use(express.static(path.join(__dirname, 'public')));
app.use(express.cookieParser());
app.use(express.bodyParser());
app.use(express.session({ secret: 'anything' }));
app.use(passport.initialize());
app.use(passport.session());
app.use(app.router);
希望这可以帮助
以前我有这些代码(没有工作):
app.use(express.static(path.join(__dirname, 'public')));
app.use(cookieParser('abcdefg'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: true}));
app.use(session({
secret: 'abcdefg',
resave: true,
saveUninitialized: false,
cookie: { secure: true } // this line
}));
app.use(passport.initialize());
app.use(passport.session());
app.use(require('stylus').middleware(path.join(__dirname, 'public')));
然后,我删除会话初始化cookie的选项:
app.use(express.static(path.join(__dirname, 'public')));
app.use(cookieParser('abcdefg'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: true}));
app.use(session({
secret: 'abcdefg',
resave: true,
saveUninitialized: false
}));
app.use(passport.initialize());
app.use(passport.session());
app.use(require('stylus').middleware(path.join(__dirname, 'public')));
现在它的工作原理。
没错使会话像@马丁说。但是,如果你使用的是快递4. *版本,中间件像会话没有被绑定,所以你需要单独安装它。
;
var express = require('express');
var cookieParser = require('cookie-parser')
var session = require('express-session')
var app = express()
app.use(cookieParser()) // required before session.
app.use(session({secret: 'keyboard cat'}))
欲了解更多信息,请检查express session documentation.
我遇到的,因为同样的问题,只是复制和粘贴以下从快车会期文件的代码,但没有完全阅读文档。
app.use(session({
secret: 'keyboard cat',
resave: false,
saveUninitialized: true,
cookie: { secure: true }
}))
在本文档中,它提到:
然而,它需要启用https的网站,即HTTPS是必要的安全cookie。如果安全设置,您通过HTTP访问您的站点,cookie将不会被设置。
所以如果你只是有一个HTTP连接,删除安全选项,下面的代码应该工作:
app.use(session({
secret: 'keyboard cat',
resave: false,
saveUninitialized: true,
//cookie: { secure: true } remove this line for HTTP connection
}))
在路线,尝试添加:{session: true}
app.get('/auto-login', passport.authenticate('cross', {session: true}))
我只好用快车4此完全相同的问题,并试图几乎一切后,我能找到在线我终于设法得到它的工作,加入“Cookie的会话”。
var cookieSession = require('cookie-session');
app.use(cookieSession({
keys: ['key1', 'key2']
}));
我的是关于cookies和CORS。我解决了通过添加如下代码到我的服务器:
allowCrossDomain = function(req, res, next) {
res.header('Access-Control-Allow-Origin', 'http://localhost:3000'); // your website
res.header('Access-Control-Allow-Credentials', 'true');
res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,OPTIONS');
res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization, Content-Length, X-Requested-With');
if ('OPTIONS' === req.method) {
res.send(200);
} else {
next();
}};