RailsをAPIとして使おうとターミナルからcurl
コマンドでPOSTしようとしたがエラった時のメモ
-
curl -X POST localhost:5000/api/tasks -d 'task[name]=fugafuga'
をやろうとして以下のエラー
エラー内容
- 422エラー:
Can't verify CSRF token authenticity
- これを日本語にすると
CSRFトークンの信頼性を確認できません
となる
普通のフォーム入力の場合
こんな感じでhiddenにCSRF対策用のtokenが埋め込まれている
- 今回curlコマンドでPOSTしたことによりこのtokenがないことにRailsが怒ったってことか。。。
調査と対応
- APIで使用する場合...
- APIはステートレスであるべきなので、認証はすべてのリクエストでサーバー側のセッションを使わずに行われる。
- なのでAPIのコントローラにはprotect_from_forgeryを追加したくない、実際CSRF攻撃のリスクはほぼない。らしい。
- 以上のことから
application_controller
にprotect_from_forgery with: :null_session
を追加してヨシとした。
application_contrller.rb
class ApplicationController < ActionController::Base
protect_from_forgery with: :null_session
end
補足
- 以下のように該当のコントローラのこのアクションを
protect_from_forgery
の対象から除外するやり方もあるみたい。
hoge_controller.rb
class HogeController < ApplicationController
protect_from_forgery :except => [:huga]
def huga
## 処理
end
end
RailsはAPIで使われることが多いから覚えておこう。
次回はAPI認証をつける
をテーマに執筆予定
以上!!