【发布时间】:2020-01-30 09:39:25
【问题描述】:
我的 NodeJS 应用程序有问题。我使用 Passport 进行身份验证,它似乎可以工作,因为没有经过身份验证的会话就无法访问受保护的路由。唯一的问题是 /login 路由在 sussessfull 登录后不会重定向。我必须手动完成。 我读了一些关于它的帖子,人们认为这可能是由于这一行,代码中没有,但我已经有了:
})(req, res, next);
完整的代码如下所示:
exports.postLogin = (req, res, next) => { req.assert('email', 'Email is not valid').isEmail(); req.assert('password', 'Password cannot be blank').notEmpty(); req.sanitize('email').normalizeEmail({ gmail_remove_dots: false });
const errors = req.validationErrors();
if (errors) {
req.flash('errors', errors);
return res.redirect('/login'); }
passport.authenticate('local', (err, user, info) => {
if (err) {
console.log("Error");
return next(err);
}
if (!user) {
console.log("Error again");
req.flash('errors', info);
return res.redirect('/login');
}
req.logIn(user, (err) => {
console.log("logged in");
if (err) {
console.log("Woops not: "+err);
return next(err);
}
req.flash('success', { msg: 'Success! You are logged in.' });
res.redirect(req.session.returnTo || '/');
}); })(req, res, next); };
还有我的护照配置:
passport.use(new LocalStrategy({ usernameField: 'email' }, (email, password, done) => {
console.log("Email fra Passport: "+email);
console.log("Password fra Passport: "+password);
let pwdhash = bcrypt.hashSync(password, 10);
const client = pool.connect();
pool.connect((err, client, release) => {
if (err) {
return console.error('Error acquiring client', err.stack)
}
client.query('SELECT * FROM "user" WHERE "email"=$1',[email], (err, result) => {
release()
if (err) {
return console.error('Error executing query', err.stack)
}
if(result.rows[0] == null){
console.log("Oops. Incorrect login details");
//req.flash('danger', "Oops. Incorrect login details.");
return done(null, false);
}
else{
bcrypt.compare(password, result.rows[0].password, function(err, check) {
console.log(pwdhash);
console.log(result.rows[0].password);
if (err){
console.log('Error while checking password: '+err);
return done(null, false, { msg: 'Password did not match.' });
}
else if (check){
console.log("All good");
return done(null, [{email: result.rows[0].email, firstName: result.rows[0].firstName}]);
}
else{
console.log("Invalid email or password: "+check);
return done(null, false, { msg: 'Invalid email or password.' });
}
});
}
console.log(result)
})
})
}));
知道为什么我的代码不会重定向到:
res.redirect(req.session.returnTo || '/');
更新:
更新了静态内容的路由和来自 app.js 的用户路由:
app.use('/', express.static(path.join(__dirname, 'public'), { maxAge: 31557600000 }));
app.use('/public', express.static(path.join(__dirname, 'public/'), { maxAge: 31557600000 }));
app.use('/views', express.static(path.join(__dirname, 'views/'), { maxAge: 31557600000 }));
app.use('/modules', express.static(path.join(__dirname, 'node_modules/'), { maxAge: 31557600000 }));
//Handling specific pathts due to the changes from local modules to node_modules, we need this:
app.use('/webfonts', express.static(path.join(__dirname, 'node_modules/@fortawesome/fontawesome-free/webfonts'), { maxAge: 31557600000 }));
app.use('/public/css/fonts/@fortawesome', express.static(path.join(__dirname, 'node_modules/@fortawesome/fontawesome-free/webfonts'), { maxAge: 31557600000 }));
app.use('/public/css/fonts/flaticon', express.static(path.join(__dirname, 'public/css/flaticon/font'), { maxAge: 31557600000 }));
app.use('/public/flaticon2', express.static(path.join(__dirname, 'public/css/flaticon2'), { maxAge: 31557600000 }));
app.use('/public/css/fonts/flaticon2', express.static(path.join(__dirname, 'public/css/flaticon2/font'), { maxAge: 31557600000 }));
app.use('/public/css/fonts/line-awesome', express.static(path.join(__dirname, 'public/css/line-awesome/fonts'), { maxAge: 31557600000 }));
/**
* Primary app routes.
*/
app.get('/', homeController.index);
app.get('/dashboard', dashboardController.index);
app.get('/login', userController.getLogin);
app.post('/login', userController.postLogin);
app.get('/logout', userController.logout);
app.get('/forgot', userController.getForgot);
app.post('/forgot', userController.postForgot);
app.get('/reset/:token', userController.getReset);
app.post('/reset/:token', userController.postReset);
app.get('/signup', userController.getSignup);
app.post('/signup', userController.postSignup);
app.get('/contact', contactController.getContact);
app.post('/contact', contactController.postContact);
app.get('/account', passportConfig.isAuthenticated, userController.getAccount);
app.post('/account/profile', passportConfig.isAuthenticated, userController.postUpdateProfile);
app.post('/account/password', passportConfig.isAuthenticated, userController.postUpdatePassword);
app.post('/account/delete', passportConfig.isAuthenticated, userController.postDeleteAccount);
app.get('/account/unlink/:provider', passportConfig.isAuthenticated, userController.getOauthUnlink);
【问题讨论】:
-
这取决于您的 app.js/server.js 是如何编写以提供静态资产或 api 调用的。
-
刚刚用 app.js 中的一些代码更新了我的问题,这是您要求的吗?
标签: node.js passport.js