RESTful API Authentication 試してみる

昨晩発見した以下を盛り込んで動作確認してみます。

とりあえず

branch 作って以下を盛り込む模様。

  • config/initializers/devise.rb にて config.token_authentication_key の設定
  • authentication_token という String な column の追加な migration 追加
  • app/controllers/sessions_controller.rb 追加
  • config/routes.rb の devise_for な設定記述の修正

むむ、こんだけなのか。盛り込み開始。

盛り込み完了

がしかし正常動作しません。試験には一応パスしている模様。
以下な出力。

WARNING: Can't verify CSRF token authenticity

むむむむ。application_controller.rb に以下を追加したら warning は出なくなったけど認証には成功しません。とほほ

  skip_before_filter :verify_authenticity_token

これって cURL とかで試験ができないってことなのかどうなのかorz

もしかして

cookie 使え、ってことなの? そうかセッション情報端末持ちだし。あと

401 Unauthorized

が戻ってきてます。つうかログ見てるにパラメータの渡し方が微妙らしいorz

できた

ええと、以下な手順で良いのかどうか。

  • authenticity_token 取得のため user/sign_in を GET
  • cookie 指定で -d "authenticity_token=xxx" して user/sign_in を GET
  • authenticity_token プラス user[email] および user[password] 指定で user/sign_in を POST

でも JSON が戻ってこないな。ちなみに authenticity_token とか cookie とか無指定でも大丈夫でしたので、パラメータの指定の方法でハマッてたのかorz
そして追加した SessionController は使われていないことも判明。

ぐぬぬ

typo 発見。

  devise_for(:users, :controllers => { :sessions => "sessions" })

:session => になってました。そして unauthorized になりました。つうことはパラメータのナニが元に戻ってるってことで email および password でアレしたら今度は以下とのこと。

undefined method `ensure_authentication_token!'

これはコピペ元の記述だな。stackoverflow によれば app/models/user.rb に :token_authenticatable を追加すれば良い模様。

  devise :database_authenticatable, :registerable, :confirmable,
         :recoverable, :rememberable, :trackable, :validatable,
         :token_authenticatable

これでイケました。

$ curl http://localhost:3000/users/sign_in -d "email=yamanetoshi@gmail.com&password=fugahoge"
{"success":true,"auth_token":"7rt8FA5UDPc8HQJH6z8A","email":"yamanetoshi@gmail.com"}

とは言え、ログによれば

DEPRECATION WARNING: devise :token_authenticatable is deprecated. Please check Devise 3.1 release notes for more information on how to upgrade. (called from at /Users/rms/Public/shurijp/shurijp/app/models/user.rb:6)

とのことなのでまだ修正の余地はあるのか。でもこれでスマホ実装なソレは着手可能なはず。

追記

以下を参考にさせて頂きました。感謝を込めて。

基本上記に token_authenticatable を追加したのみ。 deprecated ですがorz