ゆうなんとかさんの雑記帳的な。

Twitterで踊ったり音ゲーしたりしてるあの名前がよくわからない人が書いてるらしいよ。

Railsのアプリでログインできない、IDとパスワードはあってるのに。

Railsで動いているアプリでなぜかログインができない。教えてもらったIDとパスワードを何度打ち込んでもログイン画面にリダイレクトされます。
POSTしたときのログを漁ってみると、

Started POST "/login/auth" for 127.0.0.1 at 2013-04-03 20:58:22 +0900
Dalli::Server#connect 127.0.0.1:11211
127.0.0.1:11211 failed (count: 8)
127.0.0.1:11211 is still down (for 10.361 seconds now)
Session::DalliStore#get: No server available
Processing by LoginController#auth as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"ZkyDQ(more more long)", ほげほげのふーばー}
WARNING: Can't verify CSRF token authenticity
down_retry_delay not reached for 127.0.0.1:11211 (0.998 seconds left)
Session::DalliStore#destroy_session: No server available
  User Load (0.4ms)  SELECT `users`.* FROM `users` WHERE ほげほげのふーばー LIMIT 1
Redirected to http://localhost:3000/admin/index
Completed 302 Found in 4ms (ActiveRecord: 0.4ms)
down_retry_delay not reached for 127.0.0.1:11211 (0.994 seconds left)
Session::DalliStore#set: No server available
Warning! ActionDispatch::Session::DalliStore failed to save session. Content dropped.

という感じでした。
ここで最初に気になったのは2つ。

  1. Viewのファイルを見ても「utf8」と「authenticity_token」なんてname属性のinputタグないよ?
  2. 「WARNING: Can't verify CSRF token authenticity」←この警告何?

今回はこれを順を追ってメモしておきましょう。

「utf8」と「authenticity_token」というname属性のinputタグがどこから湧いてくるのか

フォームヘルパーを使うと自動的にtype="hidden"のinputタグを挿入するようです。それが上の2つ。吐き出されたHTMLを見るとちゃんと最初の方にhiddenしてあるのが分かります。

「WARNING: Can't verify CSRF token authenticity」という警告の正体(実は見当はずれでした)

訳すと「警告:CSRFトークンの認証を正しく確認できません」。おそらく上のauthenticity_tokenのことを言っているのでしょう。というかそれしか考えられません。何らかの事情でトークンの確認ができないのでしょう。とりあえずグーグル先生に聞いてみるも見当違いでした*1。結局こちらで検索するのがあたりだったようです。

Dalli::Server#connect 127.0.0.1:11211
127.0.0.1:11211 failed (count: 8)
127.0.0.1:11211 is still down (for 10.361 seconds now)
Session::DalliStore#get: No server available

なにがしかのサーバに接続できなかったのでセッションを使うことができなかったみたいですね。後々思い返してみると、どこかは忘れたけどmemcachedを使うらしいというのを思い出したので、さくっとインストールして起動しましょう。

$ sudo yum install memcached -y
$ memcached -d

今度はうまくログインできました。起動のさせ方を調べてみると同じようにmemcachedを起動していなかったために、Railsのアプリでセッションを張れなかったというお話が出てきました。どうやらここで使っていたようです。

*1:あとに正しく動くのを確認した時にもログイン時に表示されたので