【问题标题】:Creating confirmation link for Devise为设计创建确认链接
【发布时间】:2016-11-25 15:25:21
【问题描述】:

有时我们用户的确认电子邮件被挂断,我需要生成一个确认链接以手动发送给他们。我从 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

如何生成设计确认链接?

【问题讨论】:

    标签: ruby-on-rails devise


    【解决方案1】:

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

    这意味着每次为用户发送确认电子邮件时都需要生成一个新令牌。设计可以允许用户请求另一封确认电子邮件 (ConfirmationsController) - 你禁用了吗?它在您的用户类上调用send_confirmation_instructions class 方法(在设计的可确认模块中,然后调用最终调用resend_confirmation_instructions,它调用send_confirmation_instructions instance 可以生成新令牌的方法)。您可以自己在用户类上调用send_confirmation_instructions class 方法,但允许用户使用标准设计 ConfirmationsController 和路由/视图自己请求另一封确认电子邮件会更容易。

    【讨论】:

    • @Tim- 感谢您的解释。问题是有时我们的用户无法访问我们系统中自动生成的电子邮件(由于某些 ISP 的可传递性问题),这意味着无论是自动发送的还是重新发送的确认电子邮件都无法通过。在这些情况下,我们正在寻找一种方法来自己生成确认链接并通过其他方式发送。我将查看 send_confirmation_instructions 源,看看我是否可以找到一种方法来做到这一点......会更新......
    • 啊。在这种情况下,Confirmable 中的 generate_token 是生成并保存新的确认令牌的东西。它在实例中留下一个@raw_confirmation_token,这是传递给电子邮件模板的内容。你可能在那里有一些运气。如果您启用了可重新确认(但不确定),请注意可能的相互作用。
    【解决方案2】:

    如果您只想重定向用户点击确认后,也可以选择

    第 1 步 覆盖您的确认控制器中的 after_confirmation_path_for:

    在app/controllers目录下新建confirms_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 步重新启动网络服务器

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-03
      • 2016-11-28
      • 2021-05-22
      • 1970-01-01
      • 2015-11-12
      • 1970-01-01
      • 1970-01-01
      • 2011-08-21
      相关资源
      最近更新 更多