Rails Devise:设置密码重置令牌并重定向我们

在特定用例的应用程序中,我创建了一个新用户(以编程方式设置了密码),并向他们发送了一封确认电子邮件。

我希望他们能够在确认后立即更改密码(无需进入系统生成的我不想发送给他们的密码)

实际上我想要
1)系统使用生成的密码创建一个新的用户帐户。
2)系统发送确认电子邮件。
3)用户单击确认并被重定向以输入密码(有效地将其发送到如下所示的URL)

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

任何帮助/指针都将很棒。

patrickdavey asked 2020-08-11T03:43:31Z
4个解决方案
43 votes

一种简单的方法,用户只需一步即可使用您建议的链接来确认电子邮件地址并设置初始密码...

发送您的应用生成的一封电子邮件,包括reset_password_token,并考虑用户拥有该令牌,以确认该电子邮件地址的有效性。

在系统帐户生成代码中,假设使用: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 = "user@usercompany.com" #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字段。

有关reset_password_token方法和朋友的详细信息,请参见:confirmabledatabase_authenticatable.rb

如果要使用Devise :confirmable模块而不是这种方法,请参见Devise Wiki页面。

Anatortoise House answered 2020-08-11T03:44:16Z
29 votes

在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 = '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 %>
ClaytonC answered 2020-08-11T03:44:40Z
2 votes

你可以打电话

user.send(:set_reset_password_token)

它可能是不稳定的,因为它是受保护的方法,但可以满足您的情况。 只需进行测试即可。

(在Devise v。3.4上进行了测试)

Sergii Mostovyi answered 2020-08-11T03:45:09Z
2 votes

这是我的邮件预览片段

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
woto answered 2020-08-11T03:45:30Z
translate from https://stackoverflow.com:/questions/5894191/rails-devise-set-password-reset-token-and-redirect-user