kazumalab tech log

流行りとリラックマと嵐が大好きです。技術的ログ。

RailsでCSRFを無効にせずにAjaxからRESTなAPIを叩く

かずまです。

ここ最近Railsでサービスを作っている時にJavascriptをよく使います。 そのときにうーんこれはどうすれば良いのだろうと思ったので自分用にメモします。 初歩的なお話です。今回CSRFについては長くなりそうなので省略します。

始まり

  • 同じリソース内に定義したRESTのAPIJavascriptから叩きたい
  • RailsCSRF対策がされているので、AjaxでPOSTなどは400(InvalidAuthenticityToken)で弾かれる
  • RailsのController側でCSRFを無効に出来るが、あまり使いたくない

今回はこんな感じの流れだったと思います。

対策方法

今日たまたまAjaxを使った部分があって、 気になっていたので調べてみました。

blog.willnet.in

あら。すぐにありました。 Willnetさんのブログ。いつもお世話になっている...!! しかも、9年前だった...。

= hidden_field_tag "authenticity_token", form_authenticity_token

これであとはJS側でgetElementByIdとかjQueryとかでとってきてdataの中に組み込んであげれば良いのでめっちゃ便利。

Rails5になって...

techracho.bpsinc.jp

Formごとにトークンを発行できる仕様にできるみたい。 これで攻撃被害をすこしでもすくなくできるっぽいですね。