2014-09-01 29 views
10

我使用Express 4的在那里我有passport.js保护的途径,如:什么是更好的方式来验证Express 4路由器上的一些路由?

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 
}); 

所以 - 得到收集路线应(大部分)不保护我,创建/更新路线应。但是这需要我将护照传递给我所有的路由文件(到目前为止我已有7个文件),然后将其作为中间件添加到其中一些文件中。

我喜欢的版本,在那里你可以做这样的事情:

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

但是这需要在所有我的路线权威性。

有没有更好的方法来通过护照一路?

回答

26

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

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); 
+1

哇,本,这其实很聪明!我只需要修复那里的命名。 – Zlatko 2014-09-01 13:37:32

+1

这将是天才,只有当路径路径相同时它才起作用。我已经在express4,passport 0.3.2上试过了这个相同的实现,并且在路由路径上检查身份验证,而不是路由器实例。这种情况下的所有路线都受到保护。 – jbodily 2016-09-09 17:06:38

+2

如果路径路径相同,它将无法工作,如何知道您要使用哪一个?您定义的第一条路线优先。 – 2016-09-09 19:43:02