2014-09-01 27 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