44

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

確認後すぐにパスワードを変更できるようにしたいと思います(送信したくないシステム生成のパスワードを入力する必要はありません)。

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

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

ヘルプ/ポインタは素晴らしいでしょう。

4

4 に答える 4

45

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

アプリが生成する1つのメール(reset_password_tokenを含む)を送信し、そのメールアドレスの有効性を確認するトークンをユーザーが所有していることを検討します。

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

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

初期パスワードを設定するときに、デバイスのリセットパスワードビューをユーザーにとって少しわかりやすくします。

ビュー/デバイス/パスワード/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.

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

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

方法と友達の詳細についてはdevise_gem_folder/lib/devise/models/recoverable.rb、を参照してください。database_authenticatable.rbreset_password_token

:confirmableこのアプローチではなくDeviseモジュールを使用する場合は、 Devisewikiページを参照してください。

于 2011-05-11T21:30:41.500 に答える
32

Rails 4.1では、AnatortoiseHouseの応答の次の変更が機能します。

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 = 'user@usercompany.com'
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 %>
于 2014-08-22T21:31:30.577 に答える
2

あなたは呼び出すことができます

user.send(:set_reset_password_token)

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

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

于 2015-06-04T06:16:56.737 に答える
2

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

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
于 2015-09-06T01:58:48.067 に答える