Node.js 在Express 4路由器上验证某些路由的更好方法是什么?

Node.js 在Express 4路由器上验证某些路由的更好方法是什么?,node.js,authentication,express,routes,passport.js,Node.js,Authentication,Express,Routes,Passport.js,我使用的是Express 4,其中有一条受passport.js保护的路线,如下所示: var media = require('express').Router(); media.get('/', function(req, res) { // provide results from db }); media.post('/', passport.authenticate('bearer'), function(req, res) { // This route is a

我使用的是Express 4,其中有一条受passport.js保护的路线,如下所示:

var media = require('express').Router();

media.get('/', function(req, res) {
    // provide results from db
});

media.post('/', passport.authenticate('bearer'), function(req, res) {
    // This route is auth protected
});
var router = require('./my-router');
app.use('/api/route', passport.authenticate('bearer'));
app.use('/api/route', router);
因此,对于我来说,获取收集路由(大部分)不应该受到保护,而创建/更新路由应该受到保护。但这需要我将passport传递给所有路由文件(到目前为止我有7个),然后将其作为中间件添加到其中一些文件中

我喜欢这样的版本,你可以这样做:

var media = require('express').Router();

media.get('/', function(req, res) {
    // provide results from db
});

media.post('/', passport.authenticate('bearer'), function(req, res) {
    // This route is auth protected
});
var router = require('./my-router');
app.use('/api/route', passport.authenticate('bearer'));
app.use('/api/route', router);
但这需要对所有我的路线进行身份验证


有没有更好的办法把passport一路传下去?

您可以将路由器分为受保护/未受保护,并在受保护的路由上调用中间件

var express = require('express'),
    media = express.Router(),
    mediaProtected = express.Router();

media.get('/', function(req, res) {
    // provide results from db
});

mediaProtected.post('/', function(req, res) {
    // This route is auth protected
});

module.exports = {
    protected: mediaProtected,
    unprotected: media
};
然后你就可以做了

var router = require('./my-router');
app.use('/api/route', passport.authenticate('bearer'), router.protected);
app.use('/api/route', router.unprotected);

哇,本,这真是太聪明了!我只需要在那里修改命名。这将是天才,只是当路径相同时它不起作用。我在express4、passport 0.3.2上尝试了相同的实现,验证检查遵循路由路径,而不是路由器实例。在这种情况下,所有路由都为我提供了保护。如果路由路径相同,它将无法工作,它如何知道您要使用哪一个?您定义的第一条路线优先。@BenFortune您的最终解决方案是什么?