2

我向我的应用程序中的表添加了一个新的迁移,然后我进行了迁移。由于它有错误,我删除并迁移了它。当我注册一个用户并尝试使用电子邮件(设计,可确认)确认它时,它只是不会确认。它说无效的确认令牌。我已经尝试重新启动服务器。据我所知,再次删除和迁移,一切皆有可能。我正在使用 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)
4

3 回答 3

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>

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

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

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

此处突出显示了此更改的博客文章中的链接:设计电子邮件视图令牌更改

于 2013-09-27T01:10:23.953 回答
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/ 您正在寻找标题为“在数据库中存储消化的令牌”的部分

于 2013-09-16T15:27:11.657 回答
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> 

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

干杯!

于 2014-01-17T07:33:23.490 回答