req.isAuthenticated() returns FALSE (express-session, passport-local)
req.isAuthenticated() returns FALSE (express-session, passport-local)
编辑:我通过将 app.use(session({...}))
从 register.js 转移到 app.js[= 来设置 cookie 43=] 在我声明使用路由器之前 app.js。但是,问题 - req.isAuthenticated()
返回 false,仍然存在。
我正在尝试使用 passport-local、express-session 和 mongodb 为我的后端构建一个注册流程。
当我注册一个新用户时,它似乎工作正常,并且根据需要在我的数据库中创建了该用户。我还可以在 passport.authenticate()
回调 post 注册中访问 req.user
。但是,当我使用 res.redirect()
重定向到新路线时,req.isAuthenticated()
returns false 在我的新路线上。
检查浏览器中的 cookie 后,express-session 似乎从未按预期保存会话。我的本地主机没有 cookie。我已经做了数小时的研究,我遇到的大多数答案都与在初始化时仔细检查代码序列有关。我已经这样做了无数次,并尝试同时使用 passport.serializeUser(User.serializeUser());
和 passport.serializeUser(function(user, done) { done(null, user.id); });
来确保我正确地执行了该步骤。我似乎无法弄清楚为什么我会遇到这个问题。任何和所有帮助将不胜感激!我的代码中的相关片段 -
Register.js(路由器)
var express = require('express');
const session = require('express-session');
const passport = require('passport');
const LocalStrategy = require('passport-local').Strategy;
const passportLocalMongoose = require('passport-local-mongoose');
var router = express.Router();
const app = express();
app.use(bodyParser.urlencoded({extended: true}));
app.use(session({
secret:"Edit Later.",
resave:true,
saveUninitialized:true
}));
app.use(passport.initialize());
app.use(passport.session());
const userSchema = new mongoose.Schema({
name:String,
username:String,
contactNumber:String
});
userSchema.plugin(passportLocalMongoose);
passport.use(new LocalStrategy(User.authenticate()));
passport.serializeUser(User.serializeUser());
passport.deserializeUser(User.deserializeUser());
router.post('/', function(req, res, next) {
const reCaptchaKey = "<MYKEY>";
var userCaptchaToken = req.body['g-recaptcha-response'];
axios.post('https://www.google.com/recaptcha/api/siteverify', null, {params: {
secret: reCaptchaKey,
response: userCaptchaToken
}}).then(response => {
if (response.data.success === true) {
User.register({username: req.body.username, name: req.body.fullName}, req.body.password,
function(err, user) {
if (err) {
console.log(err);
// res.redirect('/views/register.html');
} else {
passport.authenticate('local', {session:true})(req, res, function() {
console.log(req.user);
console.log(req.session);
res.redirect('/profile');
console.log("Done!");
});
}
});
} else if (response.data.success === false) {
console.log("Captcha failed.");
}
}).catch(error => {
console.log(error);
});
});
module.exports = router;
Profile.js(路由器)
const express = require('express');
const router = express.Router();
router.get('/', function(req, res) {
if (req.isAuthenticated()) {
res.render('profile')
} else {
res.redirect('/register')
console.log('Not a user.')
}
})
module.exports = router;
App.js
var registrationRouter = require('./routes/register');
var profileRouter = require('./routes/profile');
app.use('/register', registrationRouter);
app.use('/profile', profileRouter);
module.exports = app;
所以经过几个小时的尝试,我想通了。我的问题是我在 Register.js
中使用了以下代码
app.use(session({
secret:"Edit Later.",
resave:true,
saveUninitialized:true
}));
app.use(passport.initialize());
app.use(passport.session());
这是一个问题,因为 Register.js 被用作路由器,我通过 [=31= 将所有请求定向到此路由]。这导致应用程序在 Register.js 处理请求之前未正确配置。以上几行是配置代码,必须写在App.js中的app.use('/register', registrationRouter);
之前。因此,修复只是将这些行移动到 App.js 就像这样 -
\configure App
app.use(session({
secret:"Edit Later.",
resave:true,
saveUninitialized:true
}));
app.use(passport.initialize());
app.use(passport.session());
\handle router
app.use('/register', registrationRouter);
编辑:我通过将 app.use(session({...}))
从 register.js 转移到 app.js[= 来设置 cookie 43=] 在我声明使用路由器之前 app.js。但是,问题 - req.isAuthenticated()
返回 false,仍然存在。
我正在尝试使用 passport-local、express-session 和 mongodb 为我的后端构建一个注册流程。
当我注册一个新用户时,它似乎工作正常,并且根据需要在我的数据库中创建了该用户。我还可以在 passport.authenticate()
回调 post 注册中访问 req.user
。但是,当我使用 res.redirect()
重定向到新路线时,req.isAuthenticated()
returns false 在我的新路线上。
检查浏览器中的 cookie 后,express-session 似乎从未按预期保存会话。我的本地主机没有 cookie。我已经做了数小时的研究,我遇到的大多数答案都与在初始化时仔细检查代码序列有关。我已经这样做了无数次,并尝试同时使用 passport.serializeUser(User.serializeUser());
和 passport.serializeUser(function(user, done) { done(null, user.id); });
来确保我正确地执行了该步骤。我似乎无法弄清楚为什么我会遇到这个问题。任何和所有帮助将不胜感激!我的代码中的相关片段 -
Register.js(路由器)
var express = require('express');
const session = require('express-session');
const passport = require('passport');
const LocalStrategy = require('passport-local').Strategy;
const passportLocalMongoose = require('passport-local-mongoose');
var router = express.Router();
const app = express();
app.use(bodyParser.urlencoded({extended: true}));
app.use(session({
secret:"Edit Later.",
resave:true,
saveUninitialized:true
}));
app.use(passport.initialize());
app.use(passport.session());
const userSchema = new mongoose.Schema({
name:String,
username:String,
contactNumber:String
});
userSchema.plugin(passportLocalMongoose);
passport.use(new LocalStrategy(User.authenticate()));
passport.serializeUser(User.serializeUser());
passport.deserializeUser(User.deserializeUser());
router.post('/', function(req, res, next) {
const reCaptchaKey = "<MYKEY>";
var userCaptchaToken = req.body['g-recaptcha-response'];
axios.post('https://www.google.com/recaptcha/api/siteverify', null, {params: {
secret: reCaptchaKey,
response: userCaptchaToken
}}).then(response => {
if (response.data.success === true) {
User.register({username: req.body.username, name: req.body.fullName}, req.body.password,
function(err, user) {
if (err) {
console.log(err);
// res.redirect('/views/register.html');
} else {
passport.authenticate('local', {session:true})(req, res, function() {
console.log(req.user);
console.log(req.session);
res.redirect('/profile');
console.log("Done!");
});
}
});
} else if (response.data.success === false) {
console.log("Captcha failed.");
}
}).catch(error => {
console.log(error);
});
});
module.exports = router;
Profile.js(路由器)
const express = require('express');
const router = express.Router();
router.get('/', function(req, res) {
if (req.isAuthenticated()) {
res.render('profile')
} else {
res.redirect('/register')
console.log('Not a user.')
}
})
module.exports = router;
App.js
var registrationRouter = require('./routes/register');
var profileRouter = require('./routes/profile');
app.use('/register', registrationRouter);
app.use('/profile', profileRouter);
module.exports = app;
所以经过几个小时的尝试,我想通了。我的问题是我在 Register.js
中使用了以下代码app.use(session({
secret:"Edit Later.",
resave:true,
saveUninitialized:true
}));
app.use(passport.initialize());
app.use(passport.session());
这是一个问题,因为 Register.js 被用作路由器,我通过 [=31= 将所有请求定向到此路由]。这导致应用程序在 Register.js 处理请求之前未正确配置。以上几行是配置代码,必须写在App.js中的app.use('/register', registrationRouter);
之前。因此,修复只是将这些行移动到 App.js 就像这样 -
\configure App
app.use(session({
secret:"Edit Later.",
resave:true,
saveUninitialized:true
}));
app.use(passport.initialize());
app.use(passport.session());
\handle router
app.use('/register', registrationRouter);