web-dev-qa-db-ja.com

Rails考案:パスワードリセットトークンを設定してユーザーをリダイレクトする

特定の使用例のアプリで、新しいユーザーを作成し(プログラムでパスワードを設定)、確認メールを送信します。

確認後すぐにパスワードを変更できるようにしたい(送信したくないシステム生成のパスワードを入力する必要がない)

実質的に私はしたい
1)システムは、生成されたパスワードで新しいユーザーアカウントを作成します。
2)システムが確認メールを送信します。
3)ユーザーは確認をクリックするとリダイレクトされ、パスワードを入力します(以下のようなURLに効率的に送信します)

<a href="http://localhost:3000/users/password/edit?reset_password_token=v5Q3oQGbsyqAUUxyqLtb">Change my password</a>

どんなヘルプ/ポインタも素晴らしいでしょう。

42
patrickdavey

ユーザーが提案したリンクを使用して、ユーザーが電子メールアドレスを確認し、初期パスワードを設定するための1つの手順を実行する簡単な方法...

Reset_password_tokenを含め、アプリが生成するメールを1通送信し、そのトークンをユーザーが所有していることを考慮して、そのメールアドレスの有効性を確認します。

システムアカウント生成コードでは、ユーザーモデルが:recoverableおよび:database_authenticatable Deviseモジュールで設定されていると想定しています...

acct = User.new
acct.password = User.reset_password_token #won't actually be used...  
acct.reset_password_token = User.reset_password_token 
acct.email = "[email protected]" #assuming users will identify themselves with this field
#set other acct fields you may need
acct.save

ユーザーが初期パスワードを設定するときに、デバイスのリセットパスワードの表示を少し明確にします。

views/devise/passwords/edit.html.erb

...
<%= "true" == params[:initial] ? "Set your password" : "Reset your password" %>
...  

生成されたメール

Hi <%= @user.name %>
An account has been generated for you.
Please visit www.oursite.com/users/password/edit?initial=true&reset_password_token=<%= @user.reset_password_token %> to set your password.

ユーザーモデルに:confirmable Deviseモジュールを含める必要はありません。アプリによって作成されたアカウントは、メールにreset_password_tokenがないとアクセスできないためです。

Deviseは送信を処理し、reset_password_tokenフィールドをクリアします。

見る devise_gem_folder/lib/devise/models/recoverable.rbおよびdatabase_authenticatable.rbの詳細についてはreset_password_tokenメソッドと友達。

Deviseを使用したい場合:confirmableこのアプローチではなくモジュール。 Devise wiki page を参照してください。

43

Rails 4.1では、Anatortoise Houseの返信を次のように変更します:

user = User.new
user.password = SecureRandom.hex #some random unguessable string
raw_token, hashed_token = Devise.token_generator.generate(User, :reset_password_token)
user.reset_password_token = hashed_token
user.reset_password_sent_at = Time.now.utc
user.email = '[email protected]'
user.save!
# Use a mailer you've written, such as:
AccountMailer.set_password_notice(user, raw_token).deliver

電子メールビューには次のリンクがあります。

www.oursite.com/users/password/edit?initial=true&reset_password_token=<%= @raw_token %>
30
ClaytonC

電話できます

user.send(:set_reset_password_token)

保護された方法であるため、安定しない可能性がありますが、ケースに応じて機能します。テストでカバーしてください。

(Devise v。3.4でテスト済み)

2
Sergii Mostovyi

これがメーラープレビューのスニペットです

class Devise::MailerPreview < ActionMailer::Preview
  def reset_password_instructions
    user = User.last
    token = user.send(:set_reset_password_token)
    Devise::Mailer.reset_password_instructions(user, token)
  end
end
2
woto