如何生成重置密码令牌

时间:2014-03-24 08:25:31

标签: ruby-on-rails devise

我正在使用devise gem进行身份验证。

在我的应用程序中,管理员将创建用户,因此当管理员创建用户时,我希望用户重置密码链接。

这是我的行动: -

def create
   @user = User.new(user_params)
   @user.password = '123123123'
   @user.password_confirmation = '123123123'
   if @user.save
         @user.update_attributes(:confirmation_token => nil,:confirmed_at => Time.now,:reset_password_token => (0...16).map{(65+rand(26)).chr}.join,:reset_password_sent_at => Time.now)
       UserMailer.user_link(@user).deliver
       redirect_to users_path
     else
    render :action => "new"
   end
end

这是我重置用户密码的链接

但是当我打开链接并更新密码时,我的重置密码令牌无效。

4 个答案:

答案 0 :(得分:33)

如果您正在使用设计,为什么要创建自己的密码重置令牌? Devise有一个功能。 http://rubydoc.info/github/plataformatec/devise/master/Devise/Models/Recoverable

如果您想知道当用户想要重置密码时,这就是设计的作用:

  raw, enc = Devise.token_generator.generate(self.class, :reset_password_token)

  self.reset_password_token   = enc
  self.reset_password_sent_at = Time.now.utc
  self.save(validate: false)

self是这里的用户对象

在您的网址中,您必须将raw作为reset_password_token参数传递

答案 1 :(得分:11)

您可以使用user.send_reset_password_instructions

答案 2 :(得分:7)

您可以使用以下内容生成令牌:

Devise.token_generator.generate(User, :reset_password_token)

虽然这本身就是一个无用的字符串。如果您确实想在链接中使用它来重置密码,则需要将其附加到用户:

user.reset_password_token = hashed_token
user.reset_password_sent_at = Time.now.utc

然后向他们发送一封包含以下链接的电子邮件:

edit_password_url(@user, reset_password_token: @token)

答案 3 :(得分:2)

如果您不希望它发送说明,只需设置并存储令牌,您就可以在设计recoverable关注set_reset_password_token中调用私有方法。

您可以通过执行user.send(:set_reset_password_token)之类的操作来完成此操作。