サインインはChromeでうまく動作しますが、Safariでは動作しません(または他のWebkitブラウザを想定しています)。あなたがサインインした後、私は(「あなたが望んでいた変更が拒否されたたぶん、あなたは、あなたがアクセス権を持っていなかった何かを変更しようとしました。」)は、このエラーメッセージが表示されます。SafariでRails/Deviseサインインが動作しない(422/CSRFエラー)
私のHerokuのログによると、
2016-12-07T14:14:23.778153+00:00 app[web.1]: Can't verify CSRF token authenticity
2016-12-07T14:14:23.778899+00:00 app[web.1]: Completed 422 Unprocessable Entity in 2ms (ActiveRecord: 0.0ms)
2016-12-07T14:14:23.785544+00:00 app[web.1]:
2016-12-07T14:14:23.785547+00:00 app[web.1]: ActionController::InvalidAuthenticityToken (ActionController::InvalidAuthenticityToken):
私は適切なCSRFトークンを送信していると思われますが、何かが誤動作しているようです。これは私の現在のapplication_controller.rb
です:
class ApplicationController < ActionController::Base
# Prevent CSRF attacks by raising an exception.
# For APIs, you may want to use :null_session instead.
protect_from_forgery with: :exception
after_action :flash_to_headers
# this is so that json requests don't redirect without a user
before_action :authenticate_user!
# before_action :authenticate_user!, unless: request.format == :json
# before_action :user_needed, if: request.format == :json
before_action :set_paper_trail_whodunnit
before_action :set_global_search_variable
def set_global_search_variable
@q = Person.ransack(params[:q])
end
def user_needed
unless current_user
render json: { 'error' => 'authentication error' }, status: 401
end
end
def flash_to_headers
return unless request.xhr?
response.headers['X-Message'] = flash_message if flash_message
response.headers['X-Message-Type'] = flash_type.to_s if flash_type
flash.discard # don't want the flash to appear when you reload page
end
private
def flash_message
[:error, :warning, :notice].each do |type|
return flash[type] unless flash[type].blank?
end
nil
end
def flash_type
[:error, :warning, :notice].each do |type|
return type unless flash[type].blank?
end
nil
end
(null_session
からprotect_from_forgery with:
を変更するだけで、ログイン画面に戻るの無限ループが発生します。)
This questionは、同様の問題を参照していますが、工夫の複雑化を議論していません。おそらくDeviseがこの問題を処理していると思われますが、何らかの形でここでは働いていません。 these answersの多くは年を取っているので、今日どのように関連性があるのか分かりません。
また、実際のDevise Githubリポジトリのバグを探してみましたが、私はこれらのスレッドの提案をどこにも持っていないようです。アプリケーションコントローラを編集するための提案はたくさんありますが、多くの場合アプリ全体がクラッシュするようです。
このアプリはRuby 2.2.5とRails 4.2.7.1を実行します。 Rails 5へのアップデートはこの問題の解決に役立つでしょうか?
adminアカウントを作成するための既存の(おそらくハッキーな)上書きもあります。その人はDeviseを介してサインアップし、次にシェルでapproved
という別のフィールドを使って管理者アクセスを手動で与えられます。それが関連しているかどうかはわかりません。
アプリは見てみたい人のために、GitHubの上にある: https://github.com/yamilethmedina/kimball
「before_action:authenticate_user!」メソッドの外観はどうですか? –
@AlexanderLunaその方法はどこにありますか?アプリケーションコントローラのその部分は 'before_action:authenticate_user!'の唯一のインスタンスですが、プロジェクトにはいくつかの 'skip_before_action:authenticate_user!'インスタンスがあります。 –
どこにあるかはわかりません。あなたはそれをそこに置くので、あなたは知る必要があります。私が尋ねる理由は、コントローラがリクエストを受け取る前に毎回呼び出されるからです。 –