gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 01:17:03 24 4
gpt4 key购买 nike

我刚刚开始在 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);

...

最佳答案

Node.js 模块是 Singleton -喜欢。这意味着每当您执行 require('passportjs') 时,您都会返回在另一个文件中导入的同一实例。

对于您的情况,在每个路由文件中,您每次都会导入相同的 Passport 实例。因此您只需定义一次 Passport 配置。

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

承载策略.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;

现在,我们终于可以一次安装它们用 Passport 固定它们一次:

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 .

关于javascript - 如何避免在多个 Express.JS 路由中重复使用 Passport.JS 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51957804/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com