web-dev-qa-db-fra.com

Erreur Rails 5 ActionController :: InvalidAuthenticityToken

J'ai une application Rails que je prévois de mettre à niveau vers Rails 5. J'utilise le système de développement (v4.2.0) avec Rails (v5.0.0). Comme suggéré dans le fichier README.md, j'ai essayé de déplacer le fichier protect_from_forgery au-dessus du fichier before_filter, mais quand j'essaie de me connecter ou de mettre à jour mon bogue, l'erreur ActionController::InvalidAuthenticityToken s'affiche.

Mon Application Controller est 

class ApplicationController < ActionController::Base
 protect_from_forgery with: :exception, prepend: true
 before_action :configure_permitted_parameters, if: :devise_controller?

  protected

   def configure_permitted_parameters
     devise_parameter_sanitizer.permit(:sign_up, keys: [:name])
     devise_parameter_sanitizer.permit(:account_update, keys: [:name])
   end

end

Et mon autre BugController est 

class BugsController < ApplicationController
  protect_from_forgery prepend: true, with: :exception
  before_action :authenticate_user!
  before_action :set_bug, only: [:show, :edit, :update]

    def update
      respond_to do |format|
      if @bug.update(bug_params)
        format.html { redirect_to @bug, notice: 'Bug was successfully updated.' }
        format.json { render :show, status: :ok, location: @bug }
     else
        format.html { render :edit }
        format.json { render json: @bug.errors, status: :unprocessable_entity }
     end
     end
   end

private
def bug_params
  params.require(:bug).permit(:product, :component, :title, :description, :status_id, :created_by_id, :assigned_to_id)
end


end
25
HSD

Remarque : Bien que cette réponse produise l'effet escompté, elle réduit toutefois la sécurité globale. La réponse ci-dessous de Alon est plus correcte et maintient la sécurité du site. 

class BugsController < ApplicationController
skip_before_filter :verify_authenticity_token
protect_from_forgery prepend: true, with: :exception
before_action :authenticate_user!
before_action :set_bug, only: [:show, :edit, :update]
end

Comme ça

11
Boltz0r

Comme indiqué dans Devise documentation notes pour Rails 5

Pour Rails 5, notez que protect_from_forgery n'est plus ajouté au début à la chaîne before_action, donc si vous avez défini authenticate_user avant protect_from_forgery, votre demande entraînera "Impossible vérifier l'authenticité du jeton CSRF." Pour résoudre ce problème, changez le fichier ordre dans lequel vous les appelez, ou utilisez protect_from_forgery prepend: true.

62
Alon Burg

J'ai récemment touché ce problème assez gros et j'ai constaté que mon erreur était que le nom de domaine de mon application avait récemment changé, mais j'ai oublié de mettre à jour session_store.rb. Ce n'est peut-être pas le problème de tout le monde, mais cela sera signalé comme une erreur CSRF. Alors s'il vous plaît vérifier config/session_store.rb

3
fuzzygroup

J'ai utilisé quelque chose comme ça et ça marche pour moi.

class WelcomeController < ActionController::Base
    protect_from_forgery with: :exception
    before_action :authenticate_model!
end
0
Yashu Mittal

Cette décision m'a aidé. J'ai pris la décision [d'ici] [1]. tout comme pour moi, le nom malheureux de ce sujet, en utilisant les mots clés d'erreur que je n'ai pas compris, je vais donc vous donner dans ce fil, car voici le nom exact de l'erreur ... dans mon cas, J'ai "ajouté" la ligne suivante au fichier application_controller.rb:

protect_from_forgery with:: null_session

il y a une solution où il est écrit "REPLACE" la ligne protect_from_forgery with:: exception, si elle existe, à celle que j'ai citée ci-dessus

 [1]: Jeton d'authenticité Rails 4

0
Vitaliy LiBrus