2012-07-31 22 views
8

私はrails authenticity tokenとDeviseログイン/ログアウトに問題があります。Rails CSRFトークンの信頼性と脆弱性

バックボーンjsを使用して1ページのアプリケーションを構築していますので、私はajaxを使ってログイン/ログアウトしています。ここに私が守っていることがあり、なぜこれが起こっているのか正確には分かりません。

私のレイアウトにはcsrf_meta_tagsがあります。ページが読み込まれ、ログインボタンをクリックしてフォームに記入して送信すると、正常にログインしています。私はログインできるユーザーができるはずのことをすることができます。

ここで私はajax経由でDELETE要求を送信するログアウトボタンをクリックし、正常にログアウトしました。

上記のすべてのプロセスは単一のページにありますが、ページのリロードはすべてのajaxで行われません。

ログインをもう一度クリックしてフォームに記入すると、Ajaxリクエストが送信されますが、ログインしても、サーバーコンソールに警告メッセージが表示されます。

WARNING: Can't verify CSRF token authenticity 

ここで、(レール)がCSRFトークンの信頼性を検証できなかった場合、私は最初になぜログインしたのですか?

と今私は、ログインしているユーザーフォームを投稿すると、エラー工夫

401 Unauthorized {"error":"You need to sign in or sign up before continuing."} 

からのメッセージやサーバーコンソール上の警告で失敗し、それが失敗した行うことができるはずという事をしようとすると

WARNING: Can't verify CSRF token authenticity 

と は、この時点で私は自分のページを更新した場合、私は私がこれ以上ログインしていますことを見ることができない、ログアウトしています。

が起こっていますか?

最初にログアウトした後、最初の信頼性トークンが期限切れになりますか?

私はあなたがすべてのあなたのAjaxリクエストにauthenticity_token変数を送信する必要があり、事前に

rails (3.2.3) 
devise (2.1.0) 

感謝:)

+2

私はまったく同じ問題を抱えています。解決策を見つけた場合はコメントしてください。 Thx – vrepsys

+0

私はなぜ問題が発生しているのか分かります。その理由はcsrfトークンはサインアウト時に期限切れとなり、そのajaxベースのsign_out以来、ページはリロードされず、新しいトークンはページに乗っていないため、後続のリクエストに不一致が生じます。今は問題を回避するためにsign_outのページをリロードしています。誰か(あなたかもしれませんか?)は、deviseメーリングリストに同じことを投稿しました。 – Abid

+0

@Abid、私の古いレールプロジェクトで同じエラーが出て、それが私を狂ったものにしてくれるのですが、解決策を見つけましたか?もしあなたがu havaなら、私たちに知らせてください。tkx – Neo

答えて

1

を使用しています。あなたはページのメタタグからそれを記入することができます。

+0

を発送しています。この問題は、2回目のログイン時にのみ発生します。トークンは1セッションのみで動作するようです – Abid