【发布时间】:2021-01-29 19:14:04
【问题描述】:
编辑:在我在 中声明使用路由器之前,我通过将 app.use(session({...})) 从 register.js 转移到 app.js 来设置 cookie app.js。但是,问题 - req.isAuthenticated() 返回 false 仍然存在。
我正在尝试使用本地护照、快速会话和 mongodb 为我的后端构建注册流程。
当我注册一个新用户时,它似乎工作正常,并且用户可以根据需要在我的数据库中创建。我还可以在我的passport.authenticate() 回调帖子注册中访问req.user。但是,当我使用 res.redirect() 重定向到新路由时,req.isAuthenticated() 在我的新路由上返回 false。
在我的浏览器中检查 cookie 后,似乎 express-session 从未按预期保存会话。我的本地主机没有 cookie。我已经进行了数小时的研究,我遇到的大多数答案都与初始化时仔细检查代码序列有关。我已经这样做了无数次,并尝试同时使用passport.serializeUser(User.serializeUser()); 和passport.serializeUser(function(user, done) { done(null, user.id); }); 来确保我正确地执行了该步骤。我似乎无法弄清楚为什么我会遇到这个问题。任何和所有的帮助将不胜感激!我的代码中的相关 sn-ps -
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;
【问题讨论】:
标签: express authentication passport.js express-session passport-local