ruby-on-rails 如何生成重置密码令牌

yzuktlbb  于 2022-12-27  发布在  Ruby
关注(0)|答案(6)|浏览(370)

我正在使用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

这是我重置用户密码的链接
但我得到重置密码令牌是无效的,当我打开链接和更新密码。

pgccezyw

pgccezyw1#

如果你正在使用devise,为什么你要创建自己的密码重置令牌?Devise有一个这样的功能。http://rubydoc.info/github/plataformatec/devise/master/Devise/Models/Recoverable
如果你想知道当用户想重置密码时devide会做什么:

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是用户对象
在URL中,您必须将raw作为reset_password_token参数传递

hi3rlvi2

hi3rlvi22#

您可以使用以下命令生成令牌:

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)
uidvcgyl

uidvcgyl3#

您可以使用user.send_reset_password_instructions来实现这一点。

pdkcd3nj

pdkcd3nj4#

如果你不想让它发送指令,只需设置并存储令牌,你就可以调用deviderecoverable concern set_reset_password_token中的私有方法。
您可以通过执行类似user.send(:set_reset_password_token)的操作来实现此目的。

6vl6ewon

6vl6ewon5#

要获取使用Devise重置密码的URL,我使用以下代码片段:

user = User.find(id)
raw, enc = Devise.token_generator.generate(User, :reset_password_token)
user.update_columns(reset_password_token: enc, reset_password_sent_at: Time.current)
puts Rails.application.routes.url_helpers.edit_user_password_url(reset_password_token: raw, host: 'localhost:3000')
flvlnr44

flvlnr446#

扩展@Rails Fan的答案,Recoverable模块中处理密码重置的具体方法是一个受保护的方法set_reset_password_token。
您可以通过以下代码访问它,它将直接返回令牌。

## your model.send(:set_reset_password_token)
user.send(:set_reset_password_token)

相关问题