【问题标题】:How to handle authentication failures on ajax calls?如何处理 ajax 调用的身份验证失败?
【发布时间】:2020-02-16 23:14:09
【问题描述】:

我的 rails 控制器有两种类型的处理程序,一种是对网页的常规响应,另一种旨在响应来自 Angular 的 $http get 请求,并返回 json 以供页面 javascript 代码处理。

我使用 devise,我在我的应用程序控制器顶部使用此代码

 protect_from_forgery
 before_action :authenticate_user!
 after_action :set_csrf_cookie

问题是,例如,当登录失效时,我认为 authenticate_user 将我的“未经授权”网页返回给调用者,而不是通知调用者当前用户不再被授权的 json,并且然后我可以正确处理客户端的情况。

任何关于有效方法的想法,而不必取出authenticate_user!来自应用程序控制器。

我的大多数控制器都有大约 15 条路由的处理程序,其中大约 50/50 用于将 json 返回到 ajax 调用,而其他的则返回网页。我喜欢 authenticate_user 的安全性!在应用程序控制器中提供,并且犹豫要删除它,而是必须有不同的代码来处理我的每个方法中的安全性。

谢谢。

【问题讨论】:

  • '我认为 authenticate_user 正在将我的“未经授权的”网页返回给调用者'——这真的很容易测试。只需在浏览器的检查器中打开网络选项卡即可。
  • 我确定有一个网页正在返回给调用者。我无法追踪到控制器方法,因为如果 authenticate_user 它将永远不会运行!失败了,但我很确定这是怎么回事。

标签: ruby-on-rails devise


【解决方案1】:

要了解它是如何工作的,您必须了解Warden(该设计基于此)和Rackbefore_action :authenticate_user! 所做的是调用 Warden.authenticate! 并要求它识别用户。 Warden 通过使用策略来识别用户。一种策略可以是使用session[:user_id] 从数据库中查找用户(这在 Devise 中 99% 的时间都在发生)或者更新颖的方法,例如 HTTP Basic Auth。

如果所有可用策略都失败,则调用失败的应用程序。这是一个机架应用程序。在Devise this is just a basic Rails controller(Rails 控制器是 Rack 兼容的应用程序)中,通常会返回一个重定向。如果你在开发环境中运行 Rails,你可能会得到一个 HTML 响应,尽管错误处理程序会向你显示那些友好的小异常页面。

您可以通过提供自己的失败应用程序来自定义响应:

class CustomAuthFailure < Devise::FailureApp
  def respond
    self.status = 401 
    self.content_type = 'json'
    self.response_body = {"errors" => ["Invalid login credentials"]}.to_json
  end 
end
# config/initializers/devise.rb
config.warden do |manager|
  manager.failure_app = CustomAuthFailure
end 

【讨论】:

  • 有帮助,但是如何确定请求是否为 ajax?我尝试使用 request.xhr?但它在所有情况下都返回 nil,包括来自角度 $http 方法的 xhr 请求。
  • 请求的标头是什么样的?我从来没有真正使用过角度,所以我不知道它发送了什么。
  • request.xhr? 只检查通常由许多(但不是全部)Ajax 框架发送的 'HTTP_X_REQUESTED_WITH' 标头。 api.rubyonrails.org/classes/ActionDispatch/…
  • 正确。回答您的问题“标题是什么样的”时遇到了一些麻烦。我正在检查请求对象,但 request.headers 有一个 84 个值的哈希值,不适合此处的注释框。我正在寻找什么'HTTP_X_REQUESTED_WITH,但我没有看到它。 . .
  • 根据其他帖子我能说的最好的,通过 $http 的角度请求不会在标头中提供 HTTP_X_REQUESTED_WITH。
猜你喜欢
  • 1970-01-01
  • 2020-05-29
  • 2014-05-25
  • 2014-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多