【问题标题】:Rails Devise: Set password reset token and redirect userRails Devise:设置密码重置令牌并重定向用户
【发布时间】:2011-08-19 03:33:02
【问题描述】:

在我的应用程序中,我针对某个用例创建了一个新用户(以编程方式设置密码)并向他们发送一封确认电子邮件。

我希望他们能够在确认后立即更改密码(无需进入系统生成的我不想发送给他们的密码)

实际上我想要
1) 系统使用生成的密码创建一个新的用户帐户。
2) 系统发送确认邮件。
3) 用户点击确认并被重定向以输入他们的密码(有效地将他们发送到如下 URL)

<a href="http://localhost:3000/users/password/edit?reset_password_token=v5Q3oQGbsyqAUUxyqLtb">Change my password</a>

任何帮助/指针都会很棒。

【问题讨论】:

    标签: ruby-on-rails devise login-control


    【解决方案1】:

    一种简单的方法,让用户只需一步即可使用您建议的链接确认电子邮件地址并设置初始密码...

    发送一封您的应用生成的电子邮件,包括 reset_password_token,并考虑用户拥有该令牌以确认该电子邮件地址的有效性。

    在系统帐户生成代码中,假设用户模型设置有 :recoverable 和 :database_authenticable 设计模块...

    acct = User.new
    acct.password = User.reset_password_token #won't actually be used...  
    acct.reset_password_token = User.reset_password_token 
    acct.email = "user@usercompany.com" #assuming users will identify themselves with this field
    #set other acct fields you may need
    acct.save
    

    在设置初始密码时,使用户的设备重置密码视图更加清晰。

    views/devise/passwords/edit.html.erb

    ...
    <%= "true" == params[:initial] ? "Set your password" : "Reset your password" %>
    ...  
    

    生成的电子邮件

    Hi <%= @user.name %>
    An account has been generated for you.
    Please visit www.oursite.com/users/password/edit?initial=true&reset_password_token=<%= @user.reset_password_token %> to set your password.
    

    无需在您的 User 模型中包含 :confirmable Devise 模块,因为如果没有电子邮件中的 reset_password_token ,您的应用创建的帐户将无法访问。

    Devise 将处理提交并清除 reset_password_token 字段。

    有关reset_password_token 方法和朋友的详细信息,请参阅devise_gem_folder/lib/devise/models/recoverable.rbdatabase_authenticatable.rb

    如果您想使用 Devise :confirmable 模块而不是这种方法,请参阅 Devise wiki page

    【讨论】:

    • 非常感谢 - 因为它刚刚创建,所以没有看到该 wiki。就像密码重置令牌自动证明被确认的想法一样。整洁。
    • 是的,对于许多 Rails 应用程序来说,这是一个很棒的工作流程。我试图弄清楚我的应用程序如何启动密码重置(生成新令牌)。记录良好。
    • 顺便说一句,我还必须将 user.reset_password_sent_at 设置为 Time.now 否则密码链接已“过期”
    • 好像reset_password_tokenhas been removed from the Recoverable model。这意味着User.reset_password_token 将在更高版本的 Devise 中出现不稳定。我认为您可以使用Devise.token_generator.generate(User, :reset_password_token) 实现类似的效果,其中User 是您的设计模型的名称。但更高兴被告知有更简洁的方法。
    【解决方案2】:

    这是我用于邮件预览的 sn-p

    class Devise::MailerPreview < ActionMailer::Preview
      def reset_password_instructions
        user = User.last
        token = user.send(:set_reset_password_token)
        Devise::Mailer.reset_password_instructions(user, token)
      end
    end
    

    【讨论】:

      【解决方案3】:

      你可以打电话

      user.send(:set_reset_password_token)
      

      它可能不稳定,因为它是一种受保护的方法,但它可以适用于您的情况。用一个测试来覆盖它。

      (在 Devise v. 3.4 上测试)

      【讨论】:

        【解决方案4】:

        在 Rails 4.1 中,对 Anatortoise House 回复的以下修改有效:

        user = User.new
        user.password = SecureRandom.hex #some random unguessable string
        raw_token, hashed_token = Devise.token_generator.generate(User, :reset_password_token)
        user.reset_password_token = hashed_token
        user.reset_password_sent_at = Time.now.utc
        user.email = 'user@usercompany.com'
        user.save!
        # Use a mailer you've written, such as:
        AccountMailer.set_password_notice(user, raw_token).deliver
        

        电子邮件视图有这个链接:

        www.oursite.com/users/password/edit?initial=true&reset_password_token=<%= @raw_token %>
        

        【讨论】:

        • 方法set_password_notice从何而来?我已经配置了一个继承自 Devise::Mailer 的自定义邮件程序,但得到一个方法未找到错误
        • 您必须自己定义它,就像任何其他普通的外发电子邮件一样,使用 ActionMailer。
        • 从 Devise 版本 3.5.1 开始,reset_password_token 将在任何更改电子邮件或密码的调用中被清除。 github.com/plataformatec/devise/blob/master/lib/devise/models/…
        • 从 Devise 版本 3.5.1 开始,reset_password_token 将在任何更改用户电子邮件或密码github.com/plataformatec/devise/blob/master/lib/devise/models/… 的调用中被清除,因此您需要在单独的用户中设置 reset_password_token 和 reset_password_sent_at 值.保存通话
        猜你喜欢
        • 2012-09-23
        • 2023-03-04
        • 2017-01-25
        • 2017-05-09
        • 2012-07-19
        • 2020-06-03
        • 2016-02-22
        • 2017-10-30
        • 1970-01-01
        相关资源
        最近更新 更多