Devise 的 HTTP 身份验证中断了常规注销

Posted

技术标签:

【中文标题】Devise 的 HTTP 身份验证中断了常规注销【英文标题】:Devise's HTTP authentication breaks regular sign out 【发布时间】:2014-02-20 04:35:12 【问题描述】:

常规登录和退出在我的应用中运行良好。但是,当我使用 HTTP 身份验证登录以访问 JSON 或 XML 资源,然后返回并单击退出按钮时,它会将我重定向到登录页面,但用户仍处于登录状态并且可以访问任何页面。在我完全关闭浏览器之前它不会注销。 This article 总体上更好地解释了这个问题。设计是否有任何解决方法或者这仍然是一个问题?

我已经阅读了很多关于它的内容,并尝试了work arounds here,但除了 IE 之外没有其他工作。有没有办法在用户注销时使 http_authenticable 凭据过期?

这里是重现问题的步骤。

    启用 HTTP 身份验证(config/initializers/devise.rb 中的 config.http_authenticable = true) 确保您已从应用程序中注销。然后访问 JSON 或 XML 资源。例如在浏览器中打开 localhost:3000/products.json 浏览器会弹出一个消息框输入用户名和密码。输入这些。 返回到常规的 html 页面。例如打开 localhost:3000/products 点击退出 注意用户仍然会登录。即使删除了cookie!!

用户在完全关闭浏览器窗口之前无法退出,这可能是公共场所的安全问题。

使用 devise (2.1.2) 和 rails (3.2.16) 进行测试

【问题讨论】:

【参考方案1】:

尝试在您的 JSON / XML 响应期间设置 Cache-Control 标头以使其不可缓存。也许这也会阻止它缓存凭据。

更新一个具体示例,说明如何使所有 API 调用不可缓存。

在应用控制器中:

def set_uncacheable
  response.headers["Cache-Control"] = "no-cache, no-store, must-revalidate"
end

before_filter :make_api_calls_uncacheable
def make_api_calls_uncacheable
  set_uncacheable if ['xml', 'json'].include?(request.format)
end

【讨论】:

我应该在 Rails 应用程序的哪个位置添加此标头,以便所有 JSON/XML 都可以拥有它? 我还没有尝试过,但我怀疑你可以执行以下操作:在ApplicationController 中,定义set_uncacheable,如我上面的答案所示。然后在ApplicationController 中添加一个名为set_uncacheable_for_api_calls 的before_filter,类似于set_uncacheable if ['xml', 'json'].include?(request.format) 它正在缓存,或者更多的是浏览器只是持有并重新发送 HTTP AUTH 标头与任何请求。 我尝试发送标头 Cache-Control 仍然不行。浏览器仍在缓存信息。我可以使用这个 js 命令在 IE 中进行 HTTP Auth 注销:document.execCommand('ClearAuthenticationCache', 'false') 但是,它不适用于 Chrome、FF 和所有其他...

以上是关于Devise 的 HTTP 身份验证中断了常规注销的主要内容,如果未能解决你的问题,请参考以下文章

使用 Devise 从 Rails 上的 json api 进行身份验证

在 Rails 中使用 Devise 注销特定用户

Rails JSON API 的简单令牌认证注销

无法让设计从 Angular.js 中注销

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

使用 Devise 1.3 对 JSON 登录请求进行身份验证