新しい Rails 4 アプリ (Ruby 2.0.0-p0 上) に取り組んでいたときに、認証トークンの問題が発生しました。
json に応答するコントローラー (respond_to
クラス メソッドを使用) を作成しているときに、アクションに到達し、を使用してレコードを作成しようとすると例外create
が発生し始めました。ActionController::InvalidAuthenticityToken
curl
設定を確認し-H "Content-Type: application/json"
、データを設定しましたが-d "<my data here>"
、まだうまくいきませんでした。
Rails 3.2 (Ruby 1.9.3) を使用して同じコントローラーを記述してみましたが、認証トークンの問題はまったく発生しませんでした。調べてみると、Rails 4 では認証トークンにいくつかの変更があったことがわかりました。私の理解では、認証トークンはフォームに自動的に挿入されなくなったのでしょうか? これは何らかの形で HTML 以外のコンテンツ タイプに影響していると思います。
HTML フォームをリクエストして、認証トークンを取得し、そのトークンを使用して別のリクエストを行うことなく、この問題を回避する方法はありますか? それとも、完全に明らかなことを完全に見逃しているのでしょうか?
編集:何も変更せずにスキャフォールドを使用して新しい Rails 4 アプリで新しいレコードを作成しようとしましたが、同じ問題が発生したため、私が行った操作ではないと思われます。
ベストアンサー1
やっとわかったと思います。(新しい)デフォルトを変更しました
protect_from_forgery with: :exception
に
protect_from_forgery with: :null_session
のコメントの通りApplicationController
。
# Prevent CSRF attacks by raising an exception.
# For APIs, you may want to use :null_session instead.
request_forgery_protecton.rb
のソース、具体的には次の行を見ると違いがわかります。
でレール3.2:
# This is the method that defines the application behavior when a request is found to be unverified.
# By default, \Rails resets the session when it finds an unverified request.
def handle_unverified_request
reset_session
end
でレール4:
def handle_unverified_request
forgery_protection_strategy.new(self).handle_unverified_request
end
どちらが呼ぶか次の:
def handle_unverified_request
raise ActionController::InvalidAuthenticityToken
end