我刚刚开始在Express应用中使用Passport.js来创建具有经过身份验证的路由的API。
问题::如果我在routes/animals.js
和routes/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);
...
答案 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。