SSブログ

Restful Authenticationプラグイン8 - forgot_password with AASM [プログラミング]

前にAASMなしで、forgot_passwordを使ったんだけど、AASMが入ってなくてそれが問題になっているのだか、forgot_passwordが悪いのか、よく分からなかったんだけど、AASMを入れて諸問題が解決しちゃったので、AASMが入ってる、その上に載っける形でいきます。ので、前提が前のエントリでAASMを含めたメール認証ができるプロジェクトを作ったということでお願いします。でも、forgot_passwordは問題アリアリでした。



今回もここを参照。

 https://github.com/greenisus/forgot_password
 http://www.func09.com/wordpress/archives/348

ruby script/plugin install git://github.com/greenisus/forgot_password.git
ruby script/generate forgot_password forgot_password user 


前回、素のままでやってエラーが出たところを事前にやっとく。
user_mailer.rbとほとんど一緒なので、forgot_password_mailer.rbも同等の設定で良い。サーバのURLとメールのアドレスを具体的なものを入れる。

 @from = "ADMINEMAIL"を大なり小なりでネストしたメールアドレスにする。
 YOURSITEと書いてあるところを、自分の環境のルートURLにする。ローカル環境ではlocalhost:3000。

これらの設定は、クラスUserMailerとForgotPasswordMailerが、スコープで見えるところに一緒にグローバル変数としておいた方がいい。どっちのクラスも設定は同じでいいはずなので、config/environments/のところに、グローバル変数として定義するのが無難かと思われ。

とりあえず、開発環境なconfig/environments/development.rbに具体的な値を設定。
$ADMINEMAIL = '<hogehoge@yahoo.co.jp>'
$YOURSITE = 'localhost:3000'


forgot_password_mailer.rbはこんな感じ。

class ForgotPasswordMailer < ActionMailer::Base
  
  def forgot_password(password)
    setup_email(password.user)
    @subject    += 'You have requested to change your password'
    @body[:url]  = "http://#{$YOURSITE}/change_password/#{password.reset_code}"
  end

  def reset_password(user)
    setup_email(user)
    @subject    += 'Your password has been reset.'
  end

  protected
    def setup_email(user)
      @recipients  = "#{user.email}"
      @from        = $ADMINEMAIL
      @subject     = "[#{$YOURSITE}] "
      @sent_on     = Time.now
      @body[:user] = user
    end
end


パスワード忘れている状態だから、ログインできないので、AASMでセッションを利用しないように、ForgotPasswordsControllerクラスごと認証させないようにする。前回、パスワード認証がプロジェクト全体に及ぶように設定しているので、forgot_passwords_controller.rbに以下の設定を加える。

 skip_before_filter :login_required



たぶんこれだけの設定で動くようになるはず。前回は失敗しているので、まだ必要な事があるかもしれないけど、一応これだけでいいはず。少なくともログインした時にメールが送られちゃうことは、AASMを入れたからなくなっているだろう。

rake db:migrate
ruby script/server


/forgot_passwordにアクセス。メールアドレスを入れて、ボタンを押してメールを送る。

送れてたり送れてなかったりする。メールアドレスによって違うので、また迷惑メールかなぁと思っていたが違うようだった。送れているメールをよく見ると、送り主のアドレスが書かれていなかった。迷惑メールになる以前に、送り主アドレスのないメールは、メールサーバにリジェクトされてる可能性がある。あ、変数名をtypoしてました。そのメールアドレスの変数がnilだったら、送り主のアドレスが空になっていたのね。恥ずかしい…。

これを直した後、存在しないメールアドレスを指定すると、これも内部的なエラーになってしまう。
NameError in Forgot passwordsController#create
undefined local variable or method `user_model_name' for #


ブラウザに出ているのが、製作者が意図したエラーじゃなくて、内部的なバグのエラーです。ここいらへんの処理の流れは、ソース読まずに動作させるのが厳しいかも。



でもまだ問題があって、/change_passwordな変更ページに誘導された後に、新しいパスワードを入れると

NameError in Forgot passwordsController#update_after_forgetting
uninitialized constant ForgotPasswordsController::PasswordMailer


とまた、内部的なエラーが出た。わざとパスワード(Password)と確認用パスワード入力(Password confirmation)を違えてみたが、これは意図的なエラーが出てもう一回入れてくれ、な画面になる。これはさっきとは違って正しい挙動になっています。適切なパスワードだと内部的なエラーになってしまうので、パスワードのチェックルーチンの後で発生しているのが分かるけど、結局何が悪いんだろう。


何が悪いか調べると、
 http://www.func09.com/wordpress/archives/348
に書いてありました。ここまで大体検討がついていたので、大してWebページを参照しなかったのが、仇となったようです。下の二行のうちどちらかをコメントアウトする事を知らなかった。

        PasswordMailer.deliver_reset_password(@user)
        ForgotPasswordMailer.deliver_reset_password(@user)


でも、こんなところのコメントアウトなんて、ソースを順に追っていってもすぐに判りかねます。ちょっとヒドい。で、どっちを使うかというと、上のPasswordMailerをコメントアウトしないとエラーが出てダメでした。でも、やっとパスワードの変更が上手くいったので、一安心です。



最終的には、何とか使えるようになったんだけど、ノーマルのままでは穴だらけと言わざるを得ない、ビミョーなプラグインでした。対応するRailsのバージョン云々とかがあるのでしょうが、デバッグが全然足りないのでしょう。いちからスクラッチするのも面倒なので、パッチ当てるように根本的にバグ出しをしたい感じ。そのうち、勉強がてらに修正しようかな、と思っています。

タグ:Ruby Rails2
nice!(0)  コメント(0) 
共通テーマ:パソコン・インターネット

nice! 0

コメント 0

コメントを書く

お名前:[必須]
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。