并发请求未完成时无法注销设计用户

Posted

技术标签:

【中文标题】并发请求未完成时无法注销设计用户【英文标题】:Unable to sign out Devise user when concurrent requests are not finished 【发布时间】:2013-04-05 01:31:03 【问题描述】:

Devise 身份验证 gem 的经典应用程序结构是仅服务器端的 Rails 应用程序。在这种情况下,当一个人退出时,没有任何东西可以阻止会话破坏。

但我正在使用 Rails+Devise+Angular.js 并尝试以正确的方式退出 - 这意味着 - /users/sign_out URL 必须由 Angular 应用程序调用,而不是通过单击 <a href="/users/sign_out"> 链接。

我的应用程序以块的形式加载数据。如果在调用 /users/sign_out URL 时某些数据请求尚未完成,则 Devise 重新登录用户。

我创建了我的自定义注销方法来看看会发生什么:

before_filter :authenticate_user!

def data_request
  .............
end

def logout
  sign_out(current_user)
  if current_user
    puts 'Has not signed out!'
  else
    puts 'Has signed out!'
  end
  redirect_to '/users/sign_out'
end

sign_out 方法调用之后current_user 确实是nil,但是接下来对data_request 的请求会通过before_filter,就好像我没有注销一样。

如果您能帮助我了解发生了什么以及如何实现可靠的注销,我将不胜感激。

更新

我遇到了一个奇怪的行为:

如果我停止 Webrick 服务器,重新启动它并重新加载页面,应用程序允许我调用 API 方法,就好像会话没有被破坏一样。据我所知,Devise 的身份验证 cookie 不包含加密/编码的登录名和密码,而是代表一个临时会话 ID,该 ID 只有在特定会话处于活动状态并且会话销毁后应该变为无效时才有效。

【问题讨论】:

【参考方案1】:

当 Angular 应用程序调用 url 时,你传递了什么方法?默认情况下,设备期望删除方法用于注销 url。尝试更改设备配置文件 (config/initializers/devise.rb) 并修改 sign_out_via 属性。默认是:delete,你只需要改成:get即可。

config/initializers/devise.rb
config.sign_out_via = :get

【讨论】:

退出方法当前设置为 GET,但没有任何区别。我试过 DELETE、GET、POST - 行为总是一样的。

以上是关于并发请求未完成时无法注销设计用户的主要内容,如果未能解决你的问题,请参考以下文章

Azure B2C 联合注销未完成(身份令牌未传递到第三方结束会话端点)

input输入中文未完成时触发change事件

结对编程-黄金点游戏之旅[二]

android 改造后注销请求给出错误 406 不可接受:用户未登录。...在邮递员 api 上工作正常

beta准备

Python3,Emacs(OSX)中的Elpy:未找到完成用户错误:无法完成