Rail 4 Devise 3.2忘记密​​码令牌无效

时间:2014-11-20 21:20:49

标签: ruby-on-rails devise

每当我设置新密码时,都会收到无效的令牌错误消息。我在Devise中调试了这个方法,reset_password_token = Devise.token_generator.digest(self,:reset_password_token,params [:reset_token]),令牌确实与保存在数据库中的令牌不同。在这里做任何人或知道为什么令牌不同?

编辑:这是我用来覆盖Devise :: PasswordController的控制器代码

class PasswordsController < Devise::PasswordsController

 def edit
   original_token       = params[:reset_password_token]
   reset_password_token = Devise.token_generator.digest(self, :reset_password_token, original_token)
   self.resource = resource_class.find_or_initialize_with_error_by(:reset_password_token, reset_password_token)
   if !resource.errors.empty?
     flash[:alert] = "Password token is invalid"
     redirect_to new_session_path(resource_name)
   end
  end
end

2 个答案:

答案 0 :(得分:0)

问题在于以下一行

Devise.token_generator.digest(self, :reset_password_token, original_token)

第一个参数应该是充当用户模型的模型类。目前,您传递了PasswordsController类。如果您还为用户模型User命名,则将该行更改为

Devise.token_generator.digest(User, :reset_password_token, original_token)

答案 1 :(得分:0)

您需要检查reset_password_period_valid?

if resource.reset_password_period_valid?
  set_minimum_password_length
  resource.reset_password_token = params[:reset_password_token]
else
  flash[:alert] = 'Your password reset link has expired, please enter your email to send a new one.'
  redirect_to new_password_path(resource_name)
end

除非您尝试按令牌更新,否则不会将已过期的令牌错误添加到资源中。