如何避免重复在多个Express.JS路由中使用的Passport.JS代码

时间:2018-08-21 23:01:49

标签: javascript node.js express passport.js

我刚刚开始在Express应用中使用Passport.js来创建具有经过身份验证的路由的API。

问题::如果我在routes/animals.jsroutes/locations.js中定义了2条路由,它们使用Passport保护某些API请求,则需要在其中创建一个passport对象,然后运行passport.use(new BearerStrategy...),然后在代码中稍后使用passport.authenticate之前。

如何避免在所有路由文件中重复passport.use(new BearerStrategy...)代码?还是重复一遍更好?

routes / animals.js

var passport = require("passport");
passport.use(new BearerStrategy(
function(token, done) {
    User.findOne({ token: token }, function (err, user) {
    if (err) { return done(err); }
    if (!user) { return done(null, false); }
    return done(null, user, { scope: 'all' });
    });
}
));

router.get('/', 
    passport.authenticate('bearer', { session: false }),
    function(req, res, next) {
        Animal.find(function(err, animals) {
            if (err) return next(err);
            res.json(animals)
        })
})

app.js

var animalsRouter = require('./routes/animals');

app.use('/api/animals', animalsRouter);

...

1 个答案:

答案 0 :(得分:1)

Node.js模块类似于Singleton。意味着每次执行require('passportjs')时,您都将取回导入到另一个文件中的同一实例。

对于您而言,在每个路由文件中,您每次都导入 same Passport实例。因此,您只需定义一次Passport配置即可。

例如,在另一个文件中定义您BearerStrategy

bearer-strategy.js

module.exports = new BearerStrategy((token, done) => {
  // ...
});

然后在主app.js中,仅配置一次Passport:

app.js

const express = require('express');
const passport = require('passport');
const bearerStrategy = require('./bearer-strategy.js');

const app = express();

// Only need to do this once
passport.use(bearerStrategy);

但是现在您需要保护您的API路由,并且避免重蹈覆辙。您可以通过将Passport中间件而不是每个路由器的/api/**应用于/api/myRouter来实现。这样您的动物路由器可以是:

routes / animals.js

const express = require('express');
const router = express.Router();

router.get('/', (req, res) => res.json(req.user));

module.exports = router;

现在,我们需要一个可以安装所有其他路由器的API路由器:

routes / api.js

const express = require('express');
const router = express.Router();

const animalRouter = require('./animals.js');

router.use('/animals', animalRouter);
// other routers

module.exports = router;

现在,最后,我们可以将它们一次装好,并通过护照一次将其固定:

app.js

const express = require('express');
const passport = require('passport');
const bearerStrategy = require('./bearer-strategy.js');
const apiRouter = require('./routes/api.js')

const app = express();

passport.use(bearerStrategy);

app.use('/api', passport.authenticate('bearer', { session: false }), apiRouter);

顺便说一句,所有Express插件/都是middleware