なんかタイトルが変ですが。
問題
Railsで(Railsに限らずですが)、POSTリクエストしようとするとCSRFのトークンが必要になります。
通常のRailsのPOSTであれば、問題ないのですが、
angularJSから($resouce
とか$http
で) 何もせず、POSTした場合に、
Can't verify CSRF token authenticity
というWARNがrails側で発生します。
これはリクエストにCSRFトークンが含まれていないため。
失敗した場合はreset_sessionが実行される(はず)。
解決方法
で、angular側でCSRFトークンを付けるには$httpProvider
のheaderでトークンをセットする。
app = angular.module(‘App’, [])
app.config ["$httpProvider", ($httpProvider) ->
$httpProvider.defaults.headers.common['X-CSRF-Token'] = $('meta[name=csrf-token]').attr('content')
]
上記の場合だとGETにも付いてしまうので、
GETメソッド以外に付ける場合は以下のようにする
app.config ["$httpProvider", ($httpProvider) ->
csrfToken = $('meta[name=csrf-token]').attr('content')
$httpProvider.defaults.headers.post['X-CSRF-Token'] = csrfToken
$httpProvider.defaults.headers.put['X-CSRF-Token'] = csrfToken
$httpProvider.defaults.headers.patch['X-CSRF-Token'] = csrfToken
$httpProvider.defaults.headers.delete['X-CSRF-Token'] = csrfToken
]
ネタ元:
Rails CSRF Protection + Angular.js: protect_from_forgery makes me to log out on POST
※ただ、こちらのスレッドではRails側でCookieを使ったやり方の方が評価されてます。お好みで!