カスタムデバイス 401 不正応答 質問する

カスタムデバイス 401 不正応答 質問する

私は Rails 3.1 アプリ用の JSON ベースの API に取り組んでいます。デフォルトの代わりに、次のようなカスタムの失敗応答を提供したいと思います。

{"error":"You need to sign in or sign up before continuing."}

私の API コントローラーには、への before_filter 呼び出しが含まれておりauthenticate_user!、これがこの JSON 応答をレンダリングします。

検索中に見つけたこのStackOverflowの質問、参照このDevise wikiエントリ残念ながら、Wiki エントリは詳細が足りず、何を言っているのか理解できません。具体的には、Devise/Warden が返したいものをレンダリングできるように、コードをどこに配置すればよいのか全くわかりません。

他の SA の質問のコメントから、私は 1.2 以上のバージョンの Devise (具体的には 1.4.2) を使用しているので、 を呼び出す必要はないようです。ただし、Wiki エントリでは、独自のレンダリング呼び出しの代わりにそれを使用するように、呼び出しをどこに行うべきかcustom_failure!は説明されていません。renderauthenticate_user!

このrender電話はどこに行きますか?

編集:メッセージ自体を変更しようとしているのではなく (devise en.ymlconfig のように)、応答の実際の形式を変更しようとしています。具体的には、次のものを返したいのです:

render :text => "You must be logged in to do that.", :status => :unauthorized

ベストアンサー1

Devise を使用してログイン試行が失敗したときに JSON エラー応答をカスタマイズする方法を探しているときに、この質問に遭遇した場合の参考として、鍵となるのは独自のカスタムFailureApp実装を使用することです。(このアプローチを使用して、一部のリダイレクト動作をオーバーライドすることもできます。)

class CustomFailureApp < Devise::FailureApp
  def respond
    if request.format == :json
      json_error_response
    else
      super
    end
  end

  def json_error_response
    self.status = 401
    self.content_type = "application/json"
    self.response_body = [ { message: i18n_message } ].to_json
  end
end

で、次のセクションdevise.rbを探しますconfig.warden

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

関連情報:

最初はオーバーライドする必要があると考えていましたDevise::セッションコントローラおそらくはrecallに渡されたオプションを使用するwarden.authenticate!が、前述のようにここ「リコールは API リクエストに対しては呼び出されず、ナビゲーション リクエストに対してのみ呼び出されます。http ステータス コードをカスタマイズする場合は、失敗アプリ レベルで行った方がよいでしょう。」

またhttps://github.com/plataformatec/devise/wiki/How-To%3a-Redirect-to-a-specific-page-when-the-user-can-not-be-authenticatedリダイレクトについても非常によく似たものを示しています。

おすすめ記事