为Devise创建确认链接

时间:2014-02-03 21:26:59

标签: ruby-on-rails devise

有时我们用户的确认电子邮件会挂断,我需要生成一个确认链接以手动发送给他们。我从Devise的邮件视图中获取了代码,但它生成的链接与自动生成的确认电子邮件生成的链接不同:

Devise确认邮件程序视图中的代码:

<p><%= link_to 'Confirm my account', confirmation_url(@resource, :confirmation_token => @token) %></p>

示例确认链接:
http://myapp.com/confirmation?confirmation_token=dTDYagcDbfJehEJPThRi

我在自定义确认链接生成器中使用的代码:

<p><%= link_to 'Confirm my account', confirmation_url(@user, :confirmation_token => @user.confirmation_token) %></p>

示例确认链接(与上述不同 - 不起作用):
http://myapp.com/confirmation?confirmation_token=162baabc80329f01209297af8c49a42e1fdf9066ffef412322b509bc5967052d

如何生成设计确认链接?

2 个答案:

答案 0 :(得分:3)

这是因为相对最近设计(我认为3.1+?)通过在将令牌(包括确认令牌)存储到数据库之前加密令牌来提高安全性。所以第二个长令牌是第一个较短令牌的加密版本,因此无法工作。确认令牌以未加密形式存在的唯一位置是发送给用户的原始电子邮件。

这意味着每次为用户发送确认电子邮件时都需要生成新令牌。设计可以允许用户请求另一封确认电子邮件(ConfirmationsController) - 你禁用了吗?它会在您的用户类上调用send_confirmation_instructions 方法(该方法位于设计的可确认模块中,然后调用最终调用resend_confirmation_instructions,调用send_confirmation_instructions 1}} 实例方法,可以生成新的令牌)。您可以自己在用户类上调用send_confirmation_instructions 方法,但允许用户使用标准设计ConfirmationsController和routes / views自行请求另一封确认电子邮件会更容易。< / p>

答案 1 :(得分:0)

如果您只想在点击确认后重新设置用户 ,则

第1步 覆盖confirmmations_controller中的after_confirmation_path_for:

在app / controllers目录中创建一个新的confirmations_controller.rb:

class ConfirmationsController < Devise::ConfirmationsController
  private
  def after_confirmation_path_for(resource_name, resource)
  your_new_after_confirmation_path
 end
end

第2步在config / routes.rb中,添加此行,以便Devise将使用您的自定义ConfirmationsController。这假设Devise在用户表上运行(您可以编辑以匹配您的用户)。

devise_for :users, controllers: { confirmations: 'confirmations' }

第3步重启网络服务器