在不同选项卡中更改用户身份验证状态时,我遇到了一些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;在我的布局中指定。
问题以许多不同的方式再现。只是几个一般的例子:
或
我已经介绍了自己的方法,以确保某些操作可用于某些已登录的用户,但由于此异常,我甚至无法看到它们的运行情况。 它是否应该以这种方式工作,只是在用户身份验证状态更改后将自己丢弃到未刷新页面的任何PATCH请求? 如果我将伪造保护模式更改为null_session或reset_session,我的应用程序会变得不那么安全吗?
非常感谢
答案 0 :(得分:0)
这是正常的和预期的。您需要了解What are sessions?
在您的应用中,会话存储在Cookie中。浏览器标签共享Cookie。如果您通过另一个浏览器窗口打开浏览器窗口也是一样。
出于安全原因,会话should be在登录/注销后重置。设计正在完成他的工作。
重置会话后,旧的CSRF令牌不再有效。这就是为什么当您从旧选项卡提交POST请求时,它会引发InvalidAuthenticityToken。
对于用户体验,您可以解除控制器中的InvalidAuthenticityToken错误,然后将用户重定向到新页面,或者为用户重新加载页面并显示错误消息。
希望得到这个帮助。