RailsでCSRFを無効にせずにAjaxからRESTなAPIを叩く
かずまです。
ここ最近Railsでサービスを作っている時にJavascriptをよく使います。 そのときにうーんこれはどうすれば良いのだろうと思ったので自分用にメモします。 初歩的なお話です。今回CSRFについては長くなりそうなので省略します。
始まり
- 同じリソース内に定義したRESTのAPIをJavascriptから叩きたい
- RailsはCSRF対策がされているので、AjaxでPOSTなどは400(InvalidAuthenticityToken)で弾かれる
- RailsのController側でCSRFを無効に出来るが、あまり使いたくない
今回はこんな感じの流れだったと思います。
対策方法
今日たまたまAjaxを使った部分があって、 気になっていたので調べてみました。
あら。すぐにありました。 Willnetさんのブログ。いつもお世話になっている...!! しかも、9年前だった...。
= hidden_field_tag "authenticity_token", form_authenticity_token
これであとはJS側でgetElementByIdとかjQueryとかでとってきてdataの中に組み込んであげれば良いのでめっちゃ便利。
Rails5になって...
Formごとにトークンを発行できる仕様にできるみたい。 これで攻撃被害をすこしでもすくなくできるっぽいですね。