2016-05-19 8 views
2

Ich verwende csurf in meinem express Projekt. Ich habe 3 Dateien:"ForbiddenError: ungültiges csrf-Token" erhalten Beim Teilen von Routen in verschiedene Dateien/Module

  • app.js - Haupteintrittspunkt
  • Routen/index.js - Index Routen
  • Routen/users.js - Benutzer Routen

Es ist Standard Boilerplate bei der Verwendung express application generator.

Ich habe eine Route in index.js:

router.get('/', csrfProtection, function(req, res, next) { 
    res.render('index', { 
     csrfToken: req.csrfToken() 
    }); 
}); 

Die Seite für diese Strecke ein Formular enthält, die ein verstecktes Feld mit csrf Token hat:

input(name='_csrf', type='hidden', value='#{csrfToken}') 

alles funktioniert gut und Ich kann das csrf-Token in der Quelle sehen.

Wenn das Formular abgeschickt wird es behandelt kaufen die Strecke in Routen/users.js:

router.post('/login', csrfProtection, function(req, resp) { 
    if(!validator.isAlphanumeric(req.username)) 
     console.log('Not alphanumeric'); 

    ... 
}); 

Es scheint, das Problem etwas mit den beiden Dateien, die zum Erstellen neuer Instanzen von csrf zu tun, und csrfToken. An der Spitze der beiden Routen Dateien, die ich benötigen sie etwa so:

var csrf = require('csurf'); 
var csrfProtection = csrf({ cookie: true }); 

Wenn ich die Login-Route in Routen setzen/index.js es funktioniert gut, was mich vielleicht gemacht hat, denke beide Instanzen verwenden unterschiedliche csrf Token.

Irgendwelche Ideen?

Antwort

0

Ja, ich glaube, dass es verschiedene CSRF-Tokens verwendet. Ich habe das Problem gelöst, indem ich eine Init-Funktion in meinen Submodulen definiert habe und dann das CSRF-Token dorthin übergeben habe. Auf diese Weise wird das CSRF-Token nur einmal erstellt. Ich denke, das Erstellen des CSRF-Tokens in app.js ist wahrscheinlich am besten, und dann können Sie es in Ihre verschiedenen Untermodule weitergeben.

Ex:

in users.js:

function init(router, csrfProtection) { 
    router.post('/login', csrfProtection, function(req, resp) { 
     if(!validator.isAlphanumeric(req.username)) 
      console.log('Not alphanumeric'); 
     ... 
    }); 
} 

module.exports.init = init; 

in app.js:

...initialize router and CSRF protection... 

var users = require('./users.js'); 
users.init(router, csrfProtection);