重新发送激活邮件 - 404错误

当用户注册时,激活电子邮件可以正常工作。但是,尝试登录和重新发送激活电子邮件会导致以下生产日志:

Started POST "/u/action/send_activation_email" for (removed ip and timestamp)
Processing by UsersController#send_activation_email as */*
Completed 404 Not Found in 2ms (Views: 0.1ms | ActiveRecord: 0.0ms | Allocations: 542)

此错误发生在运行 3.2.0.beta1-dev 的所有容器上。“production_errors.log”为空。

重现步骤:

  1. 使用默认表单注册
  2. 忽略激活电子邮件并尝试登录
  3. 在弹出窗口“您还不能登录。我们之前已向您发送了一封激活电子邮件…”中,点击“重新发送激活电子邮件”
  4. “发生错误:找不到请求的 URL 或资源。”
  5. 点击“确定”,然后出现以下弹出窗口“我们已向您发送了另一封激活电子邮件至…”(然而第二封激活电子邮件实际上并未发送)

我看到函数/操作 send_activation_email 已被速率限制。

def send_activation_email
    if current_user.blank? || !current_user.staff?
      RateLimiter.new(nil, "activate-hr-#{request.remote_ip}", 30, 1.hour).performed!
      RateLimiter.new(nil, "activate-min-#{request.remote_ip}", 6, 1.minute).performed!
    end

这会导致 404 错误吗?还有其他日志可以查看以调试此问题吗?

1 个赞

我在本地开发站点上对此进行了测试,问题似乎是,当用户(尚未点击激活电子邮件中的链接)尝试使用用户名/密码登录后发出的请求时,发送到 /u/action/send_activation_emailPOST 请求既没有设置 username 参数,也没有设置 email 参数:

相反,如果用户点击注册账户后立即显示的“账户已创建”页面上的“重新发送激活电子邮件”按钮,则会为该请求设置 username 参数。供参考,正在工作的按钮是这个:

我猜测正在工作的请求之所以有效,是因为 POST 请求的参数是根据用户在完成注册表单时输入的值设置的。

404 错误触发于:

1 个赞

这在我看来是个 bug。

只是补充一点,此问题还会阻止管理员/用户页面中已被停用的用户在尝试登录并单击“重新发送激活电子邮件”按钮后触发激活电子邮件。

这会导致与上述报告相同的错误。

2 个赞

感谢 @john.sanchirico 的报告,也感谢 @simon 提供的详细分析 :pray:

此问题将通过以下方式修复:

2 个赞

此主题已在 20 小时后自动关闭。不再允许回复。