在我的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/<;用户>/mailer/confirmation\u instructions.html.erb并将其更改为类似以下内容:
<;p>;欢迎光临<;%[email protected]%></p>;
<;p>;您可以通过以下链接确认您的帐户电子邮件:</p>;
<;p><;%=链接到“确认我的帐户”,确认url(@resource,:confirmation\u token=>;@token)%></p>;
这将修复您遇到的任何基于令牌的确认问题。这可能会修复任何解锁或重置密码令牌的问题