Rails + Devise密码重置令牌在配置的时间段

时间:2016-09-17 11:17:32

标签: ruby-on-rails ruby devise

Rails Version: 5.0.0.1
Devise Version: 4.2

在我的devise.rb文件中,我将密码令牌的生命周期定义为6小时

  # Time interval you can reset your password with a reset password key.
  # Don't put a too small interval or your users won't have the time to
  # change their passwords.
  config.reset_password_within = 6.hours

当我通过忘记密码链接选择密码重置时,我可以看到生成的时间戳和令牌

postgres=> select reset_password_token, reset_password_sent_at from users where email='email@gmail.com';
                       reset_password_token                       |   reset_password_sent_at
------------------------------------------------------------------+----------------------------
 89f51bce1bc6b495c16a50b015d03897d0520a8b58c300a5deef16b2c45cac82 | 2016-09-16 21:18:01.322362

活动记录和应用程序时区都设置​​为'Asia/Kolkata'但是当我点击电子邮件中提供的链接并尝试更改密码(在发送电子邮件的几分钟内)时,密码更改失败并显示消息

重置密码令牌已过期,请申请新密码

更新一个 我在用户模型中启用了recoverable,但此处没有用。

class User < ApplicationRecord
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable,
         :recoverable, :rememberable, :trackable, :validatable, :lockable, :timeoutable
end

更新两个

以下是实施答案

中建议的更改后的日志

将设计配置更新为

# Time interval you can reset your password with a reset password key.
# Don't put a too small interval or your users won't have the time to
# change their passwords.
config.reset_password_within = 6.hours.from_now

密码更新仍然失败,日志中也没有真正的错误。

I, [2016-09-19T20:54:04.793217 #19146]  INFO -- : Started PUT "/users/password" for ::1 at 2016-09-19 20:54:04 +0530
I, [2016-09-19T20:54:04.795888 #19146]  INFO -- : Processing by Devise::PasswordsController#update as HTML
I, [2016-09-19T20:54:04.796108 #19146]  INFO -- :   Parameters: {"utf8"=>"✓", "authenticity_token"=>"hXJycHI8Xmwo5D1pTS6a+naO1aV6PUDoqNw1kLjxWksF1zf+dEJ/j2KnmlOt0JSSe4F53cVP4uyBw1Pe0G4u8Q==", "user"=>{"reset_password_token"=>"[FILTERED]", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]"}, "commit"=>"Change my password"}
D, [2016-09-19T20:54:04.803200 #19146] DEBUG -- :   User Load (3.8ms)  SELECT  "users".* FROM "users" WHERE "users"."reset_password_token" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["reset_password_token", "f278c026f607eea0f948e79e16861a90c9f1c73af271b2b803787f5fb68bdd04"], ["LIMIT", 1]]

2 个答案:

答案 0 :(得分:0)

好吧,我不认为这是一个时区问题。您可能想知道关于Devise的以下内容。

这是您模型的Devise模块列表。

  • database_authenticatable - 用户可以使用存储在数据库中的登录名和密码进行身份验证。 (密码以摘要的形式存储)。
  • 可注册 - 用户可以注册,更新和销毁其个人资料。
  • 可恢复 - 提供重置忘记密码的机制。
  • 可记住 - 启用涉及Cookie的“记住我”功能。
  • 可跟踪 - 跟踪登录计数,时间戳和IP地址。
  • 可验证 - 验证电子邮件和密码(可以使用自定义验证程序)。
  • 可确认 - 用户必须在注册后确认其电子邮件才能被允许登录。
  • 可锁定 - 在多次失败的身份验证尝试后,用户的帐户将被锁定。

因此,如果您有重置忘记密码问题,您可能需要确保模型中已启用recoverable

例如,如果用户模型(user.rb),您将拥有

devise :database_authenticatable, :registerable,
       :recoverable, :rememberable, :trackable, :validatable, :confirmable, :lockable

启用recoverable对于处理您在Devise中重置忘记的密码非常重要。

答案 1 :(得分:0)

我在更改 Rails 时区后遇到了同样的问题。

我可以解决在 mi 用户模型上设置为 nil 重置密码字段的问题:

User.update_all(reset_password_token: nil, reset_password_sent_at: nil)