我在项目中使用Passport js进行身份验证。在服务器端,我正在使用Express js。在app.js
我有护照js的配置,代码是:
passport.use(new Strategy({
passReqToCallback: true
},
function (req, username, password, done) {
req.models.users.find({ 'user_id' : username }, function (err, user) {
if (err) { return done(err); }
if (!user[0]) {
console.log("The username is Incorrect");
return done(null, false, { message: 'Incorrect username.' });
}
if (user[0].default_password!=password) {
console.log("The Password is Incorrect");
return done(null, false, { message: 'Incorrect password.' });
}
return done(null, user);
});
}
));
passport.serializeUser(function(user, done) {
done(null, user);
});
passport.deserializeUser(function(user, done) {
done(null, user);
});
在此之后我正在验证客户端请求:
app.post('/login',
passport.authenticate('local', { failureRedirect: '/login' }),
function(req, res) {
res.redirect('/');
});
直到这里一切正常。
现在我想将这条路线app.post('/login',...
放在路线文件夹中,这样我就可以像app.js
一样给出路线的路径:
var users = require('./routes/users/users');
app.use('/users', users);
我的问题是:在这个用户路线文件中我没有护照配置,我不想再为所有其他路线重写它所以我在想将护照配置放在一个公共文件中并重复使用,但我不知道该怎么做。如果您有任何想法请帮助。感谢。
答案 0 :(得分:1)
您可以编写一个中间件,让我们调用它auth.js
,检查会话信息并为您需要的每条路径安装它。
'use strict';
const qs = require('querystring'),
router = require('express').Router();
router.use(function (req, res, next) {
// set this in res.locals
if (!req.user) {
return res.redirect('/?' + qs.stringify({
'r': req.originalUrl
}));
}
next();
});
module.exports = router;
如果您使用上述方法,则需要在res.locals.user = req.user;
中添加server/app.js
。
在此之后,您可以在需要进行身份验证的每条路由上要求上述中间件。
router.verb('/path', require('./path-to-auth'));
router.verb('/path', (req, res, next) => {
// this route will only be executed if the user is authenticated
});