用户注册时设计“确认令牌无效”

在我的web应用程序上使用Rails 4和Desive 3.1.0。我写了一个Cumber测试来测试用户注册;从电子邮件中单击“确认我的帐户”链接时失败

场景:用户使用有效数据注册#功能/用户/注册。功能:9
当我使用有效的用户数据注册时#功能/步骤定义/用户步骤。rb:87
然后我会收到一封电子邮件#features/step_definitions/email_steps.rb:51
当我打开电子邮件时#features/step_definitions/email_steps.rb:76
然后我会看到从“否”发送的电子邮件[email protected]“#功能/步骤定义/电子邮件步骤。rb:116
我应该看到“您可以通过下面的链接确认您的帐户电子邮件:”在电子邮件正文中#features/step_definitions/email_steps.rb:108
当我在电子邮件#features/step_definitions/email_steps.rb:178中点击“确认我的账户”时
然后我应该登录#features/step_definitions/user_steps.rb:142
应在“…确认令牌无效…”中找到文本“注销”(RSpec::Expections::ExpectationNotMetError)
./features/step\u definitions/user\u steps.rb:143:in`/^I应该登录$

当我通过web服务器手动注册时,这个错误也是可以重现的,所以它似乎不是一个问题

我想:

  • 用户可以单击此电子邮件的链接确认其帐户
  • 让用户在确认其帐户后保持登录状态

我已设置:

  • 来自GitHub的最新设计代码(3.1.0,参考041fcf90807df5efded5fdcd53ced80544e7430f)
  • 一个用户类,它实现了可确认
  • 使用“默认”确认控制器(我还没有定义自己的自定义控制器。)

我读过这些帖子:

  • 设计确认令牌无效
  • 设计3.1:现在有更安全的默认值
  • GitHub问题-设计确认\u令牌无效

并尝试:

  • 在我的设计初始值设定项中设置config.allow\u unsecure\u tokens\u lookup=true,这会在启动时引发“未知方法”错误。另外,听起来这只是一个临时修复,所以我想避免使用它
  • 清除my DB并从头开始(因此不存在旧令牌)

更新:

注册后检查用户上存储的确认令牌。电子邮件令牌与DBs令牌匹配。根据上面的帖子,新的设计行为表示不应该,相反,它应该基于电子邮件的令牌生成第二个令牌这是可疑的。运行User.confirm\u by_-token('[EMAIL\u-CONFIRMATION\u-token]')返回设置了错误的用户“@messages={:CONFIRMATION\u-token=>[”无效“]}”,这似乎是问题的根源

不匹配的代币似乎是问题的核心;在console中运行以下代码以手动更改用户的确认令牌会导致确认成功:

new\u-token=designe.token\u-generator.digest(用户:确认\u-token,“[EMAIL\u-token]”)
u=用户优先
u、 确认令牌=新令牌
u、 拯救
用户。通过_令牌(“[EMAIL _令牌]”)确认#成功

那么,为什么它首先要将错误的确认令牌保存到DB?我正在使用自定义注册控制器。。。可能是因为它里面有什么东西导致它被错误地设置了

routes.rb

为用户设计,
:path=>'',
:路径名称=>{
:sign_in=>“login”,
:注销=>注销,
:注册=>'register'
},
:控制器=>{
:registrations=>“用户/注册”,
:sessions=>“用户/会话”
}

用户/注册\u controller.rb

类用户::注册控制器<设计::注册控制器
def创建
#用于修复日期时间问题的自定义代码
Utils::convert_params_date_select params[:user][:profile_attributes],:birth,nil,true
超级的
终止
def注册参数
#TODO:仍然需要解决这个问题。嵌套属性的强参数不起作用。
#允许一切是一种安全隐患。
参数require(:user).permit!
#参数require(:user).permit(:email,:password,:password\u confirmation,:profile\u属性)
终止
私人:注册参数
终止

因此,升级到Desive 3.1.0给我留下了一些“积垢”,这是我很久没有接触过的

根据这篇博文,您需要将Desive mailer更改为使用@token,而不是旧的@resource.confirmation\u token

app/views/<用户&gt/mailer/confirmation\u instructions.html.erb并将其更改为类似以下内容:

<p>欢迎光临<%[email protected]%&gt&lt/p>
<p>您可以通过以下链接确认您的帐户电子邮件:&lt/p>
<p&gt<%=链接到“确认我的帐户”,确认url(@resource,:confirmation\u token=>@token)%&gt&lt/p>

这将修复您遇到的任何基于令牌的确认问题。这可能会修复任何解锁或重置密码令牌的问题

发表评论