如何将passport js配置放在一个公共文件中

how to place passport js configuration in a common file

本文关键字:一个 文件 passport js 配置      更新时间:2023-09-26

我在我的项目中使用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',...放在routes文件夹中,所以我在app.js中给出了路由的路径,如下所示:

var users = require('./routes/users/users');
app.use('/users', users);

我的问题是:在这个用户路由文件中,我没有护照配置,我不想为所有其他路由重新编写它,所以我想把护照配置放在一个公共文件中并重用它,但我不知道如何做到这一点。如果你有任何想法,请帮助。谢谢。

你可以写一个中间件,我们叫它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;

如果您使用上述方法,则需要在server/app.js中添加res.locals.user = req.user;

在此之后,您可以在每条需要认证的路由上要求上述中间件。

router.verb('/path', require('./path-to-auth'));
router.verb('/path', (req, res, next) => {
 // this route will only be executed if the user is authenticated
});