在另一个选项卡中设计登录/注销后的InvalidAuthenticityToken

时间:2015-11-26 22:17:42

标签: ruby-on-rails authentication devise

在不同选项卡中更改用户身份验证状态时,我遇到了一些InvalidAuthenticityToken异常问题。

我的应用非常简单。事实上,这只是我学习的基本学习应用程序。 https://github.com/antonkoh/railsrep/tree/master/lesson17/my_app

它使用Devise gem进行身份验证:

 <%= link_to "Sign out", destroy_user_session_path, method: :delete %>

 <%= link_to "Sign in", new_user_session_path %>

protect_from_forgery设置为:exception,因为它是一个浏览器应用程序,尚未与API相关。

我确实有&lt;%= csrf_meta_tags%&gt;在我的布局中指定。

问题以许多不同的方式再现。只是几个一般的例子:

  1. 在标签A上,我打开一个表单,以匿名用户的身份添加/编辑帖子。
  2. 在标签B上我以任何用户身份登录。
  3. 返回标签A我尝试添加帖子 结果:InvalidAuthenticityToken
    1. 在标签A上,我以登录用户的身份打开帖子列表。
    2. 在标签B上我退出。
    3. 回到标签A我尝试销毁帖子。 结果:InvalidAuthenticityToken
    4. 我已经介绍了自己的方法,以确保某些操作可用于某些已登录的用户,但由于此异常,我甚至无法看到它们的运行情况。 它是否应该以这种方式工作,只是在用户身份验证状态更改后将自己丢弃到未刷新页面的任何PATCH请求? 如果我将伪造保护模式更改为null_session或reset_session,我的应用程序会变得不那么安全吗?

      非常感谢

1 个答案:

答案 0 :(得分:0)

这是正常的和预期的。您需要了解What are sessions?

在您的应用中,会话存储在Cookie中。浏览器标签共享Cookie。如果您通过另一个浏览器窗口打开浏览器窗口也是一样。

出于安全原因,会话should be在登录/注销后重置。设计正在完成他的工作。

重置会话后,旧的CSRF令牌不再有效。这就是为什么当您从旧选项卡提交POST请求时,它会引发InvalidAuthenticityToken。

对于用户体验,您可以解除控制器中的InvalidAuthenticityToken错误,然后将用户重定向到新页面,或者为用户重新加载页面并显示错误消息。

希望得到这个帮助。