Rails设计:设置密码重置令牌并重定向用户

pat*_*vey 42 ruby-on-rails login-control devise

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

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

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

<a href="http://localhost:3000/users/password/edit?reset_password_token=v5Q3oQGbsyqAUUxyqLtb">Change my password</a>
Run Code Online (Sandbox Code Playgroud)

任何帮助/指针都会很棒.

Ana*_*use 43

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

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

在系统帐户生成代码中,假设用户模型设置为:recoverable和:database_authenticatable设计模块...

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
Run Code Online (Sandbox Code Playgroud)

设置初始密码时,设备的设置重置密码视图会更加清晰.

视图/设计/口令/ edit.html.erb

...
<%= "true" == params[:initial] ? "Set your password" : "Reset your password" %>
...  
Run Code Online (Sandbox Code Playgroud)

生成的电子邮件

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.
Run Code Online (Sandbox Code Playgroud)

无需在用户模型中包含:确认设计模块,因为如果没有电子邮件中的reset_password_token,将无法访问您的应用创建的帐户.

Devise将处理提交并清除reset_password_token字段.

devise_gem_folder/lib/devise/models/recoverable.rbdatabase_authenticatable.rb对细节reset_password_token的方法和朋友.

如果您想使用Devise :confirmable模块而不是此方法,请参阅Devise wiki页面.

  • 似乎`reset_password_token` [已从可恢复模型中删除](https://github.com/plataformatec/devise/commit/d75fd56f150f006aee51dcafc7157454190de570).这意味着`User.reset_password_token`将在更高版本的Devise中摇摆不定.我想你可以用`Devise.token_generator.generate(User,:reset_password_token)`来实现类似的东西,其中`User`是你的Devise模型的名字.但更高兴的是被告知有一种更简洁的方式. (16认同)
  • 顺便说一下,我还必须将user.reset_password_sent_at设置为Time.now,否则密码链接"已过期" (8认同)

小智 29

在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
Run Code Online (Sandbox Code Playgroud)

电子邮件视图具有以下链接:

www.oursite.com/users/password/edit?initial=true&reset_password_token=<%= @raw_token %>
Run Code Online (Sandbox Code Playgroud)

  • 从设计版本 3.5.1 开始,reset_password_token 将在任何更改用户电子邮件或密码的调用中被清除 https://github.com/plataformatec/devise/blob/master/lib/devise/models/recoverable.rb 所以你'需要在单独的 user.save 调用中设置 reset_password_token 和 reset_password_sent_at 值 (2认同)