【问题标题】:Mailer unable to access reset_token in User model邮件程序无法访问用户模型中的 reset_token
【发布时间】:2015-01-11 04:19:52
【问题描述】:

面临@user.reset_token 返回 nil 的问题。

app/views/user_mailer/password_reset.html.erb

<%= link_to "Reset password", edit_password_reset_url(@user.reset_token, email: @user.email) %>

Reset_token 是在 User 模型中声明的,当我尝试使用 sidekiq worker 时会出现这个问题。参考下面的代码。

app/models/user.rb

class User < ActiveRecord::Base

attr_accessor :reset_token

  def User.new_token
    SecureRandom.urlsafe_base64
  end  

  def send_password_reset_email
    PasswordResetWorker.perform_async(self.id)
  end  

private

  def create_reset_digest
    self.reset_token = User.new_token
    update_attribute(:reset_digest,  User.digest(reset_token))
    update_attribute(:reset_sent_at, Time.zone.now)
  end 

app/workers/password_reset_worker.rb

class PasswordResetWorker
  include Sidekiq::Worker
  sidekiq_options retry: false

  def perform(user_id)
    user = User.find(user_id)
    UserMailer.password_reset(user).deliver
  end
end

app/mailers/user_mailer.rb

class UserMailer < ActionMailer::Base
  default from: "noreply@example.com"

  def password_reset(user)
    @user = user
    mail to: user.email, subject: "Password Reset"
  end
end

当我不使用工人时,这个问题不会发生

app/models/user.rb

  def send_password_reset_email
    UserMailer.password_reset(self).deliver
  end

想知道我可以用什么替换“@user.reset_token”?如果您需要更多信息,请告诉我。提前致谢。

【问题讨论】:

标签: ruby ruby-on-rails-4 actionmailer sidekiq attr-accessor


【解决方案1】:

您没有将reset_token 存储在数据库中 - 您正在存储reset_digest

当您不使用 worker 时,您将 reset_token 存储在 User 实例中,然后将相同的 User 实例传递给您的邮件程序 - 因此 reset_token 仍然可用。

当您使用工作人员时,您的工作人员只有用户 ID,因此它正在从数据库中重新加载用户实例。因为reset_token 没有存储在数据库中,所以返回为零。

您应该将reset_token 保存在数据库中,或者您的密码电子邮件应该在URL 中使用reset_digest

【讨论】:

  • 嘿,谢谢!是的,我也很怀疑。有没有机会我仍然可以做到这一点而无需在数据库中保存 reset_token 或使用 reset_digest?我认为这样做是为了安全。
  • 存储令牌然后使用令牌进行身份验证是可以的,只要令牌足够复杂。
  • 如果你真的关心安全性,你可以将生成的reset_token 作为额外参数传递给 Sidekiq 工作线程。不过,直接使用令牌就足够了,因为密码重置应该是短暂的事情,到期时间相对较短。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-08
  • 1970-01-01
相关资源
最近更新 更多