3

我已经使用令牌身份验证/json api 实现了设计。我现在的问题是,每当“?auth_token”错误或丢失时,设计将我“HTTP/1.1 302 临时移动”重定向到我想要的 json 错误响应,而不是直接返回:“HTTP/1.1 403 Forbidden”。

我的错误响应来自我的 SessionsController < Devise::SessionsControllers "new" 操作,我认为这可能是错误的地方。

我找不到设计进行重定向的地方或我可以改变这种行为的地方。谁能给我一个线索?

非常感谢,克里斯

4

2 回答 2

4

您可以创建一个自定义的失败ruby​​ 文件,并通过将其放在您的 lib 目录中来提供所需的重定向,然后将其包含在您的设计initializer中,就像它在此SO Post中提到的那样。

故障应用的定义定义在:

https://github.com/plataformatec/devise/blob/master/lib/devise/failure_app.rb

或者

您可以在自己的控制器中使用以下代码:

before_filter :correct_auth, :if => { request.format == :json }

  def correct_auth
    unless current_user
      render :json => {'error' => 'authentication error'}, :status => 403
    end
  end

因此,如果您auth_token不正确,则意味着没有用户应该登录到应用程序,因此您可以显示authentication error 403.

于 2013-03-13T09:49:50.170 回答
3

仅出于文档目的,这里是我执行的步骤:

HOWTO 设计自定义故障应用程序

添加到devise.rb

  config.warden do |manager|
    manager.failure_app = CustomFailure
  end

创建lib/devise/custom_failure.rb

class CustomFailure < Devise::FailureApp

  def redirect_url
    login_page_url
  end

  # You need to override respond to eliminate recall
  def respond
    if http_auth?
      http_auth
    else
      if request.format.json?
        self.status = :unauthorized
        self.response_body = { :elements => {:id => "Authentication Failed", :description =>   "Invalid or missing authentication token"} }.to_json
        self.content_type = "json"
      else
        redirect
      end
    end
  end

end
于 2013-03-13T12:36:14.940 回答