Node.js使用csurf有条件地使用express 4

我尝试在我的快速应用程序的几条路线上使用csurf。 这是方法:

var express = require('express'); var session = require('express-session'); var csrf = require('csurf'); // some more stuff var csrfExclusion = ['/myApi','/unsecure']; var app = express(); var conditionalCSRF = function (req, res, next) { if (csrfExclusion.indexOf(req.path) !== -1){ next(); } else{ csrf(); } }); app.use(conditionalCSRF); 

甚至尝试过:

 var conditionalCSRF = function (req, res, next) { if (csrfExclusion.indexOf(req.path) !== -1){ next(); } else{ csrf(req, res, next); next(); } }); 

 var conditionalCSRF = function (req, res, next) { if (csrfExclusion.indexOf(req.path) !== -1){ next(); } else{ csrf(); next(); } }); 

但是这给了我一个错误:对象#没有方法'csrfToken'

我怎样才能有条件地使用csurf。 该文件只给出了在快递应用程序中的所有路线上使用它的信息

 app.use(csrf()); 

但那不是我想要的,我想排除一些路线…

善良…马丁

更新:

最后它的工作。 我做了以下几点:

 app.use(function(req, res, next){ if (csrfExclusion.indexOf(req.path) !== -1) { next(); } else { csrf()(req, res, next); }); 

这有条件地添加了csrf中间件。 但是我真的觉得这样称呼是很奇怪的:

 csrf()(req, res, next); 

我甚至没有得到语法…

根据这个你需要把它分成两个路由器,一个使用csurf,一个不使用。 然后,您将中间件应用到路由器,而不是应用程序。

 var routes = express.Router(); var csrfExcludedRoutes = express.Router(); routes.use(csrf()); routes.get('/', function(req, res) { //has req.csrfToken() }); csrfExcludedRoutes.get('/myApi', function(req, res) { //doesn't have req.csrfToken() }); 

这是一个古老的线程,但我偶然发现它,并认为我会试图解决@marshro提出的在中间件中调用csrf()(req, res, next)的怪异问题。

这里发生的事情是,csurf从require语句返回一个函数,它本身被用来构build一个具有一些可选configuration参数的中间件函数。

对上面中间件中使用的csrf()的调用使用缺省选项为每个需要csrf保护的传入请求构build中间件函数。 如果你真的想使用这种方法,你有机会做一个简单的改变,使你的解决scheme更有效率地进行一个非常小的重构来构build中间件:

 // 1. Build the csrf middleware function 'csrfMw' once. var csrfMw = csrf(); app.use(function(req, res, next){ if (csrfExclusion.indexOf(req.path) !== -1) { next(); } else { // 2. Use the middleware function across all requests. csrfMw(req, res, next); } ); 

这就是说 – 如果有机会,您可能需要再次查看文档 – build议采用两种避免这种方法的方法。 第一个设置中间件csrfProtection并将其应用于select路由。 第二个设置了两个路由器,就像上面提到的@ ben-fortune–一个将csrf应用于一切,另一个不是。 两者都比排除条件更有效率。

所有这一切说 – 我可以看到案件有一个排除名单,并可能使用你的方法,如果我没有时间手动拆分路线。 ;)