RailsでサードパーティのJavaScriptを配信するときにハマったこと

髪の毛が長くて、浮浪者みたいになってきました。きたけーです。

最近、趣味でつくっているRailsのプロダクトでサードパーティJavaScript(ブログパーツとか)を配信しようとしてハマったのでメモ。

おもむろにJSを返すアクションを書くと...

最初は試しにコントローラをつくって、その中でJSを返すようなアクションの処理を書いたのですが、エラーになりました。※

Rails4.1から、JSを返すGETリクエストに対してもCSRFのprotectionが働くのでした。

Cross-site request forgery (CSRF) protection now covers GET requests with JavaScript responses, refs: http://edgeguides.rubyonrails.org/4_1_release_notes.html

※ 結局、サードパーティーのスクリプトのためにコントローラをつくったり、asset pipelineの仕組みを使うのは不適切だと判断して、今はpublic配下に設置しています(ファイルの結合とか圧縮はgruntにやらせてます)。

同一のOriginかチェックしているアクションをスキップすることで解決

Railsのコードを読んだら、 同一のOriginかチェックするメソッドをみつけて、 これをprotect_from_forgeryメソッド内でafter_actionとして追加しているのが分かったので、 対象のコントローラ、アクションに対して、アクションをスキップするようにして解決しました。

skip_after_action :verify_same_origin_request