【问题标题】:devise confirmation token is invalid设计确认令牌无效
【发布时间】:2013-09-16 14:41:14
【问题描述】:

我向我的应用程序中的表添加了一个新的迁移,然后我进行了迁移。由于它有错误,我删除并迁移了它。当我注册用户并尝试使用电子邮件(设计,可确认)确认它时,它只是不会确认。它说无效的确认令牌。我已经尝试重新启动服务器。据我所知,再次删除和迁移,一切皆有可能。我正在使用 Rails 3.2.9 和 Ruby 1.9.3。设计版本为 3.1.0。 Devise 也包含在我添加的其他 gem 中,例如 rails-messaging 和 active-admin。

Started POST "/users/confirmation" for 127.0.0.1 at 2013-09-16 19:42:47 +0530
Processing by Devise::ConfirmationsController#create as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"4lMxdlsMqRCJB1doxt/hTCQhUPvAoGPiSbr9wQA/ZAQ=", "user"=>{"email"=>"pro.aravind@gmail.com"}, "commit"=>"Resend confirmation instructions"}

User Load (0.2ms)  SELECT "users".* FROM "users" WHERE "users"."unconfirmed_email" = 'pro.aravind@gmail.com' LIMIT 1

User Load (0.2ms)  SELECT "users".* FROM "users" WHERE "users"."email" = 'pro.aravind@gmail.com' LIMIT 1
  User Load (0.2ms)  SELECT "users".* FROM "users" WHERE "users"."confirmation_token" = 'cc47150f51ec476aa40ea1d546e27c0dafc37ffc8bb82272a9f2377c863daed1' LIMIT 1
   (0.1ms)  begin transaction
   (0.3ms)  UPDATE "users" SET "confirmation_token"='cc47150f51ec476aa40ea1d546e27c0dafc37ffc8bb82272a9f2377c863daed1', "confirmation_sent_at" = '2013-09-16 14:12:47.174313', "updated_at" = '2013-09-16 14:12:47.175384' WHERE "users"."id" = 1
   (175.3ms)  commit transaction
  Rendered devise/mailer/confirmation_instructions.html.erb (0.6ms)

Sent mail to pro.aravind@gmail.com (5099ms)
Date: Mon, 16 Sep 2013 19:42:47 +0530
From: please-change-me-at-config-initializers-devise@example.com
Reply-To: please-change-me-at-config-initializers-devise@example.com
To: pro.aravind@gmail.com
Message-ID: <523711df6bb56_3a029657f88282b@aravind-VPCEB46FGB.mail>
Subject: Confirmation instructions
Mime-Version: 1.0
Content-Type: text/html;
 charset=UTF-8
Content-Transfer-Encoding: 7bit

<p>Welcome pro.aravind@gmail.com!</p>

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

<p><a href="http://localhost:3000/users/confirmation?confirmation_token=cc47150f51ec476aa40ea1d546e27c0dafc37ffc8bb82272a9f2377c863daed1">Confirm my account</a></p>

Redirected to http://localhost:3000/users/sign_in
Completed 302 Found in 5387ms (ActiveRecord: 0.0ms)

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.2 devise devise-confirmable


    【解决方案1】:

    将在这里添加我的经验,以防它可以帮助其他人。正如 BillyMFH 所说,升级到 Device 3.1 改变了创建令牌的方式。博文里面有很多资料,这个答案中的问题解决方法是暂时的。

    如果 config.allow_insecure_token_lookup 设置为 false(并且一旦弃用此选项),我的解决方法是更新 Devise 用于发送包含令牌的链接的电子邮件视图。

    旧设计电子邮件视图包含如下行:

    <p><%= link_to 'Change my password', edit_password_url(@resource, :reset_password_token => @resource.reset_password_token) %></p>
    

    这使用存储在数据库中的旧令牌。现在你只需这样做:

    <p><%= link_to 'Change my password', edit_password_url(@resource, :reset_password_token => @token) %></p>
    

    只需将资源中的旧令牌替换为新的实例变量@token

    此更改的博客文章中的链接在此处突出显示:Devise email view token change

    【讨论】:

      【解决方案2】:

      这可能与 Devise 3.1 中的安全更新有关。发送给用户的令牌与数据库中的令牌不匹配。您可以通过将其包含在您的设计初始化程序中来关闭此功能:

      config.allow_insecure_token_lookup = true
      

      但最好只删除用户并使用新令牌系统创建一个新用户。

      请参阅这篇关于 Devise 3.1 中的安全更改的博文:http://blog.plataformatec.com.br/2013/08/devise-3-1-now-with-more-secure-defaults/ 你是 寻找标题为“在数据库中存储消化的令牌”的部分

      【讨论】:

        【解决方案3】:

        只需要在更新设计时进行以下更改,否则

        在文件 app/views/devise/mailer/confirmation_instructions.html.erb 的以下行中

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

        换行为 -

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

        这肯定会解决你的问题,它对我有用。

        干杯!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-09-08
          • 1970-01-01
          • 2013-11-29
          • 1970-01-01
          • 2015-06-23
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多