每当我设置新密码时,都会收到无效的令牌错误消息。我在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
答案 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
除非您尝试按令牌更新,否则不会将已过期的令牌错误添加到资源中。