【问题标题】:Rails+Devise password reset token expires before the configured time periodRails+Devise 密码重置令牌在配置的时间段之前过期
【发布时间】:2017-01-25 13:13:07
【问题描述】:
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]]

【问题讨论】:

  • 在我自己的情况下禁用registrable 不会影响我。您可能想检查您是否启用了recoverable
  • 在用户模型中启用
  • 打开您的 irb 控制台并运行 Time.now 以便我们查看时间是否与您的当地时间一致。
  • MacBook-Pro-2:website anadi$ irb 2.3.1 :001 &gt; Time.now =&gt; 2016-09-17 20:30:05 +0530 2.3.1 :002 &gt;
  • 我在我的回答中添加了评论。我希望这行得通。您也可以在测试它是否有效之前重新启动服务器。

标签: ruby-on-rails ruby devise


【解决方案1】:

嗯,我认为这不是时区问题。您可能想了解以下关于 Devise 的信息。

这是您模型的设计模块列表。

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

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

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

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

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

【讨论】:

  • 在用户模型中启用了可恢复
  • @AnadiMisra 因为从您的irb 运行Time.now 会为您提供正确的时间,然后从您的devise.rb,将时间计算更改为以下任何一个:config.reset_password_within = 6.hours.from_nowconfig.reset_password_within = Time.now + 6.hours注意:您可以执行 `Time.zone = "TimeZoneHere" 来更改您的时区。我希望这行得通。
  • 初始化程序在启动时加载。您要输入持续时间而不是时间,否则一旦您的应用运行 6 小时,所有令牌都会过期。
  • config.confirm_within = 1.minute
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 2011-08-19
    • 1970-01-01
    • 2018-03-31
    • 2020-06-03
    • 1970-01-01
    • 1970-01-01
    • 2012-09-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多