みそみそりんりんblog

勉強したことを書いていきます

Rails:Ajaxを使用してリクエストを送った際、Unprocessable Entity 422 となってしまう件について

実行環境

問題

  • js(jQuery)のajaxでcreateアクション(users::books#create)にリクエストを飛ばすとUnprocessable Entity 422となってしまう。

  • Rails側のエラーを見てみると「ActionController::InvalidAuthenticityToken (Can't verify CSRF token authenticity.):」となっていた。

  • どうやら、CSRFトークン認証ができなかったという内容のエラーである。

対応策

解決策1 application_controller.rbを修正

protect_from_forgery with: :null_session

↑この変更により、CSRF対策が『例外の発生』から『セッションのクリア』になる。 『セッションのクリア」の場合、処理は継続されるためAPIのエンドポイントを叩いたら結果が返ってくるようになる。

解決策2 特定のcontrollerを修正

skip_before_action :verify_authenticity_token

↑を追加 影響範囲が限定的になる

参考にしたサイト

【Rails】 API開発で『Can't verify CSRF token authenticity』といわれたときの対応 - Qiita

知っておきたいクロスサイトリクエストフォージェリの仕組み | yamory Blog

RailsのCSRF保護を詳しく調べてみた(翻訳)|TechRacho by BPS株式会社