Rails rails 4 + devise 两次退出登录会报 ActionController::InvalidAuthenticityToken

downmaopian · 2013年12月04日 · 最后由 aptx4869 回复于 2013年12月07日 · 3316 次阅读

刚才拿 ruby-china 试了下,好像是同样的问题。 问题重现: 开两个浏览器 tab,然后在第一个 tab 点退出,成后后,切到第二个 tab,再点退出,就会报错。 问题原因好像是这个: http://blog.plataformatec.com.br/2013/08/csrf-token-fixation-attacks-in-devise/ Devise will clean up the CSRF Token after any authentication (sign in, sign up, reset password, etc). 本来我以后这个问题不常见,很少很有用户碰到,但实际上我们站每天都会有几个这样的异常发生。 现在我是直接覆盖了 handle_unverified_request 方法,判断当请求的 url 是'退出'时,就忽略掉。 大神们有什么好方法不??

500.html做的漂亮点 😄

#2 楼 @downmaopian just a joke. devise应该把这种情况考虑在处理范围内,可以发个 issue 给devise看看他鸟不鸟

严格来说不是 devise 的问题,后端本来就应该是这样设计才安全……这问题应该由前端解决,用户实际都已经退出了你为什么还显示个退出按钮给他点??

#3 楼 @dddd1919 I know you~~~ github 上是有 issue 的,https://github.com/plataformatec/devise/issues/2586,不过那哥们最后是把

protect_from_forgery with: :exception

改掉了,这样的话,貌似所有的 ActionController::InvalidAuthenticityToken 都不会被抛出来了。。。

#4 楼 @aptx4869 我这里碰到的情况是同时有两个页面开着(a 和了)。。用户在 a 页面退出,和 b 页面没啥关系啊

#5 楼 @downmaopian 你再仔细想想……我这反正是实现 ab 页同时“退出”了,虽然设计的初衷是为了不出现与当前用户相关的页面缓存而不是为了这个问题

@aptx4869 两个 tab,一个退出,如果不做处理的话,第二个 tab 是不知道的,这个应该有后端解决,如果前端解决的话就得处理两个 tab 间的通讯

#7 楼 @tyaccp_guojian 设个 cookie 就完事了,有多难……

需要 登录 后方可回复, 如果你还没有账号请 注册新账号