如何在设计中获取密码重置URL?

vik*_*k-y 5 ruby-on-rails devise

我将我的数据从旧系统移植到用ruby写在轨道上的新系统.为了让老用户注册,我打算将他们的旧数据转移到新系统,但我无法转移他们的旧密码,所以我打算创建一个随机密码然后再设置密码重置链接并向他们发送一封自定义电子邮件邀请他们到我的新系统.

Devise提供了这个: user.send_reset_password_instructions

但这会向用户发送"忘记密码"电子邮件.我只是想以某种方式获取忘记密码的URL,以便我可以在我自己的邮件中使用该URL并在以后发送它.我试过抬头,但到处都谈论"send_reset_password_instructions"功能.知道我怎么能这样做吗?

Hie*_*ham 8

重置密码url由reset_password_tokenin Usermodel 形成.

因此,保存reset_password_token足以在reset password url以后恢复.

reset_password_token = 'XYZ' # Example token
reset_password_url = Rails.application.routes.url_helpers.edit_user_password_path(reset_password_token: reset_password_token)
Run Code Online (Sandbox Code Playgroud)

  • 不确定这是否是最近的更改,但 Devise 在 users.reset_password_token 中存储的只是发送到密码重置链接的令牌的摘要。所以我认为实际上不可能恢复原始令牌。唯一的选择是创建一个新令牌并在数据库中重置它。 (2认同)

Pet*_*ela 5

出于安全考虑(攻击者可以从数据库读取链接以绕过电子邮件验证),Devise 存储的user.reset_password_token只是发送到密码重置链接中的令牌的摘要。

具体来说,在该set_reset_password_token方法中,enc将oded token保存到数据库中,同时raw返回token,然后在密码重置电子邮件中发送。

您可以做的是自己重置令牌并将原始令牌保存在某个位置以供以后使用:

raw = user.send(:set_reset_password_token)
Run Code Online (Sandbox Code Playgroud)

还值得注意的是,您可以自定义设计邮件程序并提供您自己的模板。但是,在这种情况下,它也会影响合法的密码重置电子邮件。