2016-05-19 18 views
2

別のファイル/モジュールにルートを分割するとき。 - メインエントリポイント 入手「ForbiddenError:無効なCSRFトークン」私は私の<a href="https://www.npmjs.com/package/express" rel="nofollow">express</a>プロジェクトで<a href="https://www.npmjs.com/package/csurf" rel="nofollow">csurf</a>を使用してい

  • ルート/ index.js - インデックスルート
  • ルート/ users.js - ユーザールート
    • app.js:私は3つのファイルを持っていますexpress application generatorを使用しているとき

      これは、標準の決まり文句です。

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

      すべてが正常に動作して:

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

      このルートのページはCSRFトークンで隠しフィールドを持つフォームが含まれてい

      私はindex.jsでルートを持っていますソースのcsrfトークンが見えます。

      フォームは、それが処理されます提出されるルート/ users.jsでルートを買う:

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

      問題は両方のファイルがcsrfの新しいインスタンスを作成することとは何かで表示され、 csrfToken

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

      私はルート/ index.jsにログインルートを置く場合、それは私が多分両方のインスタンスが異なるCSRFを使用していると思う作った、正常に動作します:私はそうのようにそれらを必要とし、両方のルートファイルの先頭にトークン。

      アイデア?

    答えて

    0

    はい、私はそれが別のCSRFトークンを使用していると信じています。サブモジュールでinit関数を定義し、CSRFトークンを渡して問題を回避しました。そうすれば、CSRFトークンは1回だけ作成されます。おそらくapp.jsにCSRFトークンを作成するのが一番良いと思うので、さまざまなサブモジュールに渡すことができます。

    例:users.jsで

    :app.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; 
    

    ...initialize router and CSRF protection... 
    
    var users = require('./users.js'); 
    users.init(router, csrfProtection); 
    
    関連する問題

     関連する問題