2011-05-05 32 views
4

我在使用OmniAuth验证我的Rails应用程序时遇到了大量问题。我重新启动我的服务器,并在隐身模式下打开一个新标签(以便清除Cookie)并加载我的应用。我登录,然后通过应用程序。设计在XHR上注入HTTP验证并注销

当我到达通过AJAX调用认证动作的页面时,它会通过HTTP基本认证来请求用户名和密码。我已在我的devise.rb中禁用此功能。

config.http_authenticatable = false 
config.http_authenticatable_on_xhr = false 

当我回到上一页时,它会将我重定向到登录页面并要求登录。当我访问不需要验证的页面时,也会发生这种情况,然后返回到已验证的页面

这变得非常令人沮丧。我已将Devise和Warden解包到我的供应商/宝石目录中,以便我可以尝试调试它,但我实在无法弄清楚从哪里开始。任何帮助将非常感激。

回答

3

您的AJAX调用可能不会设置CSRF令牌。您可能需要更新您的UJS gem(可能是jquery-rails)或手动将X-CSRF-Token HTTP标头设置为标记的值。看到这个问题:Devise session immediately expiring on .js call [AJAX]。您可以通过在config/application.rb中夹紧config.allow_forgery_protection = false暂时禁用CSRF保护来测试是否存在问题。

如果你使用手动路由,你应该首先获取'authenticity_token'元标记的值,然后用它作为实际元标记的名称,而不是硬编码引用'csrf-token ”。

如果可以,我会建议更新到Rails 3.0.10或3.1。我在3.0.7上仍然遇到问题。

+2

这可能不言而喻,但只是为了防止任何人使用此答案...将config.allow_forgery_protection设置为false有助于排除故障,但是您绝不应在生产环境中运行此设置。它让你面对高风险的CSRF攻击。 – 2011-11-09 22:32:08