2012-04-06 14 views
19

Używam uwierzytelniającego użytkownika devise! metoda w kontrolerze. To działa dobrze, gdy auth_token zawrzeć we wniosku jest poprawna, ale jeśli uwierzytelnianie nie powiedzie się, że skończę z:Jak usunąć przekierowanie html w devise authenticate_user

curl -XGET 'http://localhost:3000/my_obj?auth_token=wrongtoken' 

<html><body>You are being <a href="http://localhost:3000/users/sign_in">redirected</a>.</body></html> 

Jak używać Rabl, co jest najlepszym sposobem, aby mieć coś podobnego

{'error' : 'authentication error'} 

zwrócił intead przekierowania html?

Odpowiedz

41

to zrobić w Unikaj filtr z: format =>: odpowiedzi json i zrobić mój własny filtr do renderowania moją odpowiedź JSON, jeśli nie current_user wprost

class MyController < ApplicationController 
    before_filter :authenticate_user!, :unless => { request.format == :json } 
    before_filter :user_needed, :if => { request.format == :json } 

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

Innym sposobem może być czystsze jest zdefiniowanie własne FailureApp (https://github.com/plataformatec/devise/blob/master/lib/devise/failure_app.rb)

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

    def json_failure 
    self.status = 401 
    self.content_type = 'application/json' 
    self.response_body = "{'error' : 'authentication error'}" 
    end 
end 

w swojej opracować pliku config dodają:

config.warden do |manager| 
    manager.failure_app = MyFailureApp 
end 
+0

Próbowałem drugie podejście, aby uniknąć konieczności powtarzania tego samego kodu we wszystkich moich kontrolerów. Stworzyłem klasę MyFailureApp w lib/failure.rb i zmieniłem konfigurację. Nie udaje mi się, żeby to działało, ale dostaję "!! Nieoczekiwany błąd podczas przetwarzania żądania: niezainicjowana stała MyFailureApp '. Masz pomysł, dlaczego ten facet nie zostanie załadowany? – Luc

+0

Potrzebujesz, aby twój plik wymagał "awarii" w konfiguracji Devise – shingara

+0

(głupio mnie) Świetnie, to działa dobrze. Dzięki. – Luc

32

W nowszych wersjach opracować (używam 2.2.0), można skorzystać z opcji navigational_formats w pliku konfiguracyjnym opracowania, devise.rb:

# ==> Navigation configuration 
# Lists the formats that should be treated as navigational. Formats like 
# :html, should redirect to the sign in page when the user does not have 
# access, but formats like :xml or :json, should return 401. 
# 
# If you have any extra navigational formats, like :iphone or :mobile, you 
# should add them to the navigational formats lists. 
# 
# The "*/*" below is required to match Internet Explorer requests. 
config.navigational_formats = ["*/*", :html] 

Dopóki :json nie ma na tej liście, a Twoje zapytanie kończy się .json, będzie się zachowywać tak, jak chcesz.

+2

To zaoszczędziło mi niesamowitą ilość czasu, dziękuję! –

+0

Byłem zaskoczony przez cały dzień, dopóki nie zobaczyłem twojego punktu o żądaniu kończącym się w .json. Dobry program, dobry program. –

+2

Dodaj 'application/json' do' Headers' zapytania i nie potrzebujesz '.json' na końcu f url. – rmagnum2002

Powiązane problemy