2017-10-17 11 views
0

J'ai une application qui utilise Rails et React. La partie AJAX dans les rails fonctionne bien, mais j'ai des composants dans React qui utilisent AJAX et l'erreur se produit dans les requêtes AJAX via les composants React.Impossible de vérifier le jeton CSRF dans Rails + React App

je reçois l'erreur suivante:

2017-10-17T15:36:26.933083+00:00 app[web.1]: [14b2fc9e-80b7-490f-b905- 
5be9f6839c5b] Started POST "/quiz_submissions" for 162.158.165.188 at 2017-10-17 15:36:26 +0000 
2017-10-17T15:36:26.935109+00:00 app[web.1]: [14b2fc9e-80b7-490f-b905- 
5be9f6839c5b] Processing by QuizSubmissionsController#create as JSON 
2017-10-17T15:36:26.935151+00:00 app[web.1]: [14b2fc9e-80b7-490f-b905-5be9f6839c5b] Parameters: {"quiz_submission"=>{"quiz_problem_id"=>"21", "checked_option_ids"=>["88"]}} 
2017-10-17T15:36:26.935688+00:00 app[web.1]: [14b2fc9e-80b7-490f-b905-5be9f6839c5b] Can't verify CSRF token authenticity. 
2017-10-17T15:36:26.936459+00:00 app[web.1]: [14b2fc9e-80b7-490f-b905-5be9f6839c5b] Completed 422 Unprocessable Entity in 1ms (ActiveRecord: 0.0ms) 
2017-10-17T15:36:26.937451+00:00 app[web.1]: [14b2fc9e-80b7-490f-b905-5be9f6839c5b] 
2017-10-17T15:36:26.937485+00:00 app[web.1]: [14b2fc9e-80b7-490f-b905-5be9f6839c5b] ActionController::InvalidAuthenticityToken (ActionController::InvalidAuthenticityToken): 

J'ai essayé d'ajouter le jeton CSRF en-tête ajax en ajoutant à mon main.js

$.ajaxSetup({ 
    beforeSend: function(xhr) {xhr.setRequestHeader('X-CSRF-Token', 
    $('meta[name="csrf-token"]').attr('content'))}, 
}); 

Cela fonctionne tout à fait bien sur ma machine locale, mais donne la même erreur sur l'environnement de production (Heroku).

Sinon, j'ai aussi essayé d'ajouter le jeton CSRF dans l'en-tête des demandes individuelles ajax intérieur du React composant comme suit:

$.ajax({ 
     dataType: 'JSON', 
     type: 'POST', 
     url: '/quiz_submissions', 
     context: this, 
     headers: { 
      'X-CSRF-Token': $('meta[name="csrf-token"]').attr('content') 
     }, 
     data: { 
     ... 
     } 
     } 

Cette approche fonctionne aussi bien au niveau local, mais donne la même Can't verify CSRF token authenticity. erreur sur la production .

je <%= csrf_meta_tags %> sur ma section de tête et j'ai aussi //= require jquery_ujs sur mon application.js

Toute idée pourquoi il ne fonctionne pas sur l'environnement de production sur Heroku?

+0

Peu de choses; Premièrement, Rails fait de la magie derrière les scènes pour appliquer automatiquement des jetons CSRF aux requêtes non-get. Donc vous ne devriez pas avoir besoin de faire ça. Le fait que cela ne fonctionne pas est un signe que la balise csrf sur votre application n'est pas définie correctement. Je suppose que c'est le résultat d'avoir une page de connexion asynchrone (construite avec réagir, plutôt que d'un formulaire HTML traditionnel), ainsi la balise CSRF n'est pas définie lors de la connexion. Vous pouvez résoudre ce problème en mettant à jour manuellement la balise CSRF après la connexion avec les informations reçues de la connexion. – gravityplanx

+0

J'utilise un dispositif pour le formulaire de connexion. Et j'ai d'autres parties qui utilisent ajax (pas dans le composant de réaction) et je ne reçois aucune erreur 'ne peut pas vérifier l'authenticité du jeton CSRF. 'Sur ces requêtes ajax non réactives, donc je ne pense pas que ça pourrait poser problème avec la page de connexion, pourrait-il? – Swojeet

+0

Essayez celui-ci => 'https: // stackoverflow.com/questions/7203304/warning-cant-verify-csrf-token-authenticity-rails # answer-43138944' – 7urkm3n

Répondre

0

Probablement, Cela devrait fonctionner.

LINK HERE !!!


utilisation jquery.csrf (https://github.com/swordray/jquery.csrf).

  • Rails 5.1 ou version ultérieure

    $ yarn add jquery.csrf 
    
    //= require jquery.csrf 
    
  • Rails 5.0 ou avant

    source 'https://rails-assets.org' do 
        gem 'rails-assets-jquery.csrf' 
    end 
    
    //= require jquery.csrf 
    
  • code source

    (function($) { 
        $(document).ajaxSend(function(e, xhr, options) { 
        var token = $('meta[name="csrf-token"]').attr('content'); 
        if (token) xhr.setRequestHeader('X-CSRF-Token', token); 
        }); 
    })(jQuery); 
    

+0

Hey @ 7urkm3n, j'ai ajouté le 'jquery.csrf' et l'ajax fonctionne pendant que je précompile mes ressources localement et le pousse à heroku. Mais si précompile des actifs sur heroku il est dit: 'Sprockets :: FileNotFound: impossible de trouver le fichier 'jquery.csrf' avec le type 'application/javascript'' J'ai ajouté nodejs buildpack à heroku avant le buildpack ruby ​​et la précompilation les assets réussissent mais ensuite je reçois la même erreur 'ne peut pas vérifier l'authenticité du jeton CSRF.'. – Swojeet

+0

comment l'avez-vous installé localement? – 7urkm3n

+0

Vous voulez dire 'jquery.csrf'? J'ai couru 'yarn add jquery.csrf' et ai inclus' // = require jquery.csrf' dans mon 'application.js'. Et j'ai enlevé les en-têtes qui avaient un jeton CSRF sur les requêtes ajax et cela fonctionnait localement et aussi sur heroku mais j'ai jeté cette erreur: 'Sprockets :: FileNotFound: impossible de trouver le fichier 'jquery.csrf' avec le type 'application/javascript'' sur les actifs de précompilation sur Heroku. – Swojeet