设计确认令牌无效

时间:2013-09-16 14:41:14

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

我在我的应用中向表中添加了新迁移,然后进行迁移。由于它有错误,我放弃并迁移它。当我注册用户并尝试使用电子邮件(设计,确认)进行确认时,它将无法确认。它表示无效的确认令牌。我试过重启服务器。据我所知,一切都可能掉线和迁移。我使用的是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)

3 个答案:

答案 0 :(得分:3)

在这里添加我的经验,以防它可以帮助别人。作为BillyMFH升级到Device 3.1说改变了令牌的创建方式。博文中有很多信息,这个答案中的问题解决方案是暂时的。

如果config.allow_insecure_token_lookup设置为false(并且不推荐使用此选项),我的修复就是更新Devise用于发送包含令牌的链接的电子邮件视图。

Old Devise电子邮件视图包含以下行:

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

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

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

只需使用新的实例变量@token

替换资源中的旧令牌

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

答案 1 :(得分:1)

这可能与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/您是  寻找标题为“在数据库中存储消化的令牌”的部分

答案 2 :(得分:1)

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

在文件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> 

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

干杯!