8

我的用户.rb:

class User < ActiveRecord::Base

    devise :database_authenticatable, :registerable,:confirmable,:token_authenticatable,
     :recoverable, :rememberable, :trackable, :validatable, :authentication_keys => [:name]

我的路线:

devise_for :users, :controllers => { :sessions => "sessions", :confirmations => "confirmations", :passwords => "passwords", :registrations => "registrations" }

我的 ConfirmationsController 是标准控制器,但具有不同的重定向。

我的电子邮件中有链接,例如:

/users/confirmation?confirmation_token=167bad44a15e02b0bd570b51e1bf927b88368d8855d92b9833a24017a2bad4be

在数据库中用户有

confirmation_token:167bad44a15e02b0bd570b51e1bf927b88368d8855d92b9833a24017a2bad4be

但是当我点击那个链接时,我只看到页面:

Resend confirmation instructions
 Confirmation token is invalid

我不做什么 - 我还需要设置什么。

确认控制器:

def resource_params
 params.require(:user).permit(:confirmation_token)
   end
   private :resource_params


  def show
self.resource = resource_class.confirm_by_token(params[:confirmation_token])

if resource.errors.empty?
  set_flash_message(:notice, :confirmed) if is_navigational_format?
  sign_in(resource_name, resource)
  session['new_user'] = true
  respond_with_navigational(resource){ redirect_to after_confirmation_path_for(resource_name, resource) }
else
  respond_with_navigational(resource.errors, :status => :unprocessable_entity){ render :new }
end
  end

  protected
    # The path used after resending confirmation instructions.
    def after_resending_confirmation_instructions_path_for(resource_name)
      new_registration_path(resource_name)
    end

我说“标准控制器”是因为当我删除它并且不使用自定义控制器时问题是一样的。

4

3 回答 3

17

您使用的是哪个版本的设备?如果您处于3.1.0或更高,则预期会出现以下行为:

变更日志.md

存储在数据库中的令牌不应与您在确认电子邮件中发送的令牌匹配。请参阅devise/lib/devise/models/confirmable.rb,现在包含以下内容:

def confirm_by_token(confirmation_token)
  original_token     = confirmation_token
  confirmation_token = Devise.token_generator.digest(self, :confirmation_token, confirmation_token)

  confirmable = find_or_initialize_with_error_by(:confirmation_token, confirmation_token)

如您所见,您通过查询字符串参数传入的令牌被 使用Devise.token_generator,并且该操作的结果是与数据库中的令牌进行比较以发现用户记录。

看起来暂时可以(在 3.1 但不是 3.2)通过设置来关闭它

config.allow_insecure_token_lookup = true

在您的设计初始化程序中。但默认行为已更改,以使设计更安全。有关设计 3.1 中安全改进的完整概要,请参阅此博客文章,包括此更改。

于 2013-08-23T00:16:57.577 回答
5

您可以使用下面的解决方案(设置config.allow_insecure_token_lookup = true),但根据设计变更日志,这将只是暂时可用。

问题可能是因为您运行设计生成器,在他们进行这些更改之前将他们的所有视图转储到您的视图中。然后你更新了你的 Devise gem,所有后端的东西都改变了,但你的观点没有。现在,您所有与设计相关的视图和邮件都已过时,无法与新的令牌样式一起使用。

您可以在以下位置查看新电子邮件:https ://github.com/plataformatec/devise/tree/master/app/views/devise/mailer 。主要的变化是改变这条线:

<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>

主要的区别是@resource.confirmation_token变得公正@token

于 2014-05-06T01:43:29.457 回答
2

@resource.confirmation_token改为@token然后它工作。

于 2014-07-25T03:19:19.507 回答