确认令牌无效

时间:2014-06-24 12:49:12

标签: ruby-on-rails

我正在使用Devise 3.2.2。并打开Confirmable。

使用SQL,它显示在users表中创建了一个成功的令牌。

令牌位于生成的电子邮件链接中。但是点击它,给出确认令牌无效错误。我已经有了工作代码,允许使用用户名或电子邮件进行登录,但希望这不会产生冲突。

ERB:

<p>Welcome <%= @email %>!</p>

<p>You can confirm your account email through the link below:</p>

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

用户模型:

class User < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
     :recoverable, :rememberable, :trackable, :validatable, :confirmable

  # Virtual attribute for authenticating by either username or email
  # This is in addition to a real persisted field like 'username'
  attr_accessor :login

  # Setup accessible (or protected) attributes for your model
  attr_accessible :email, :password, :password_confirmation, :remember_me, :approved, :role, :username, :userfriendlyname, :persona, :public, :login, :active, :confirmation_token, :confirmed_at, :confirmation_sent_at  
  # attr_accessible :title, :body



  # MTM 06/21/2014 to allow for login with username or email
  def self.find_for_database_authentication(warden_conditions)
    conditions = warden_conditions.dup
    if login = conditions.delete(:login)
      where(conditions).where(["lower(username) = :value OR lower(email) = :value", { :value => login.downcase }]).first
    else
      where(conditions).first
    end
  end

    # MTM 06/23/2014 to allow for login with username or email
  def self.find_first_by_auth_conditions(warden_conditions)
    conditions = warden_conditions.dup
    if login = conditions.delete(:login)
  where(conditions).where(["lower(username) = :value OR lower(email) = :value", { :value => login.downcase }]).first
    else
      where(conditions).first
    end
  end

end

2 个答案:

答案 0 :(得分:0)

首先,我在SO上阅读了很多其他类似的问题,这个问题至少有助于理解流程,因为用户处于类似的绑定状态。 Devise Confirmation Resend "Login can't be blank" error & Confirmation link from email has "Confirmation token is invalid" error

但是我得到了解决方案来处理以下事情。

第1步。

confirmation_instructions.html.erb最初是在我使用pre Devise 3.1.x版本时创建的,因此link_to代码已更改。 SO中有很多文章。

基本上,替换:confirmation_token =&gt; @ resource.confirmation_token with:confirmation_token =&gt; @token。

第2步。

这是棘手的部分。我之前创建了一个自定义邮件程序,工作正常,因此必须将Devise操作复制到自定义邮件程序中。同样,也许是因为我当时使用的是旧版本的Devise,在这些操作中没有提及@token,所以在confirmation_instructions动作/方法中添加了@token =标记,因为标记被传递到此动作/方法作为参数。

  def confirmation_instructions(record, token, opts={})
    @token = token    
    devise_mail(record, :confirmation_instructions)
  end

通过这样做,并在我提交重新发送确认指令请求时查看Rails控制台,我可以看到其他SO文章关于典型的Devise 3.1和更高行为的讨论,即,confirm_token是创建并存储在数据库中,但它与确认说明电子邮件发送的值不同,后者似乎是加密版本。当我点击电子邮件链接时,它进入登录页面并说确认成功。

答案 1 :(得分:-2)

使用您的代码更改此代码并检查。

%p = link_to'确认我的帐户',confirmation_url(@resource,:confirmation_token =&gt; @resource)