web-dev-qa-db-ja.com

Rails 5 ActionController :: InvalidAuthenticityTokenエラー

Railsアプリケーションがあり、Rails 5.にアップグレードする予定です。Rails(v5.0.0)とともにdevise(v4.2.0)を使用しています。 devise README.mdファイルで提案されているように、protect_from_forgeryをbefore_filterの上に移動しようとしましたが、ログインまたはバグを更新しようとするとエラーActionController::InvalidAuthenticityTokenが発生します

私のApplication Controller

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

私の他のBugController

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

:この回答には望ましい効果がありますが、全体的なセキュリティが低下します。以下のアロンの回答はより正確で、サイトのセキュリティを維持しています。

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

このような

11
Boltz0r

Devise documentation Rails 5の注意事項に示されているように

Rails 5の場合、protect_from_forgerybefore_actionチェーンの前に追加されないため、authenticate_userの前にprotect_from_forgeryを設定した場合、リクエストは「CSRFトークンの信頼性を検証できません」という結果になります。これを解決するには、呼び出す順序を変更するか、protect_from_forgery prepend: trueを使用します。

71
Alon Burg

私は最近これをかなり大きな方法でヒットし、私のエラーは私のアプリケーションのドメイン名が最近変更されたことであることがわかりましたが、session_store.rbを更新するのを忘れていました。それはすべての人の問題ではないかもしれませんが、CSRFエラーとしてこれを報告します。 config/session_store.rbをチェックしてください

3
fuzzygroup

私はこのようなものを使用しましたが、それは私のために機能します。

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

この決定は私を助けました。 [ここから] [1]を決定しました。私と同じように、そのトピックの不幸な名前は、そこに到達しなかったエラーのキーワードを使用しているので、ここにエラーの正確な名前があるので、このスレッドで説明します。私の場合、次の行をapplication_controller.rbファイルに「追加」しました。

protect_from_forgery with:: null_session

「REPLACE」行protect_from_forgery with:: exceptionが存在する場合は、上記で引用したものに対応するソリューションがあります

[1]: Rails 4 Authenticity Token

0
Vitaliy LiBrus