現状の問題
RailsでAPI開発をしている際にエンドポイントを叩いたら以下のようなエラーが出ました。
Can't verify CSRF token authenticity.
Completed 422 Unprocessable Entity in 22ms (ActiveRecord: 0.0ms)
CSRFトークン認証ができなかったという内容のエラーです。
解決方法
方法1. application_controller.rbを修正
controllers/application_controller.rb
を見ると以下のようなコメントがあります。
Prevent CSRF attacks by raising an exception.
For APIs, you may want to use :null_session instead.
コメントに従い、以下のように変更すれば問題は解決します。
- protect_from_forgery with: :exception
+ protect_from_forgery with: :null_session
この変更により、CSRF対策が『例外の発生』から『セッションのクリア』になります。
『セッションのクリア」の場合、処理は継続されるためAPIのエンドポイントを叩いたら結果が返ってくるようになります。
方法2. APIで利用するcontrollerを修正
APIで利用するcontrollerに対して以下のメソッドを追加します。
skip_before_action :verify_authenticity_token
こちらのほうが、application_controller.rb
を修正するのに比べて影響範囲が限定的になります。
さいごに
ツイッター(@nishina555)やってます。フォローしてもらえるとうれしいです!