2013-07-18 14 views
15

Ich habe eine Rails-API-Anwendung erstellt und fuhr fort, es mit Token-Authentifizierung zu sichern.authenticate_or_request_with_http_token Rückgabe von HTML anstelle von JSON

Ich habe eine before_filter eingestellt, die eine Methode aufruft, die authenticate_or_request_with_http_token verwendet. Alles funktioniert gut, aber wenn die Authentifizierung falsch ist, erhalte ich eine HTML-Antwort.

Wie kann ich definieren, welches Format die Antwort sein sollte?

before_filter :restrict_access 

private 

def restrict_access 
    authenticate_or_request_with_http_token do |token, options| 
    check_token token 
    end 
end 

def check_token(token) 
    Session.exists?(access_token: token) 
end 
+1

Können Sie etwas von Ihrem Code zeigen, damit Leute wirklich helfen können. – GoGoGarrett

+0

@GoGoGarrett hat meine Frage aktualisiert. –

Antwort

28

Durch die Einbeziehung ActionController::HttpAuthentication::Token::ControllerMethods Sie umfassen verschiedene Methoden, ua request_http_token_authentication die einfach ein Wrapper um Token.authentication_request ist. Das #authentication_request -Methode ist der Täter und sendet den Klartext (nicht HTML als Frage schon sagt) wie folgt:

def authentication_request(controller, realm) 
    controller.headers["WWW-Authenticate"] = %(Token realm="#{realm.gsub(/"/, "")}") 
    controller.__send__ :render, :text => "HTTP Token: Access denied.\n", :status => :unauthorized 
end 

Der Trick ist request_http_token_authentication in Ihrem ApplicationController-nicht Anruf Token.authentication_request außer Kraft zu setzen, aber die richtigen einstellen Status und Header und dann Rendern JSON stattdessen. Fügen Sie das zu Ihrem ApplicationController hinzu:

protected 
def request_http_token_authentication(realm = "Application") 
    self.headers["WWW-Authenticate"] = %(Token realm="#{realm.gsub(/"/, "")}") 
    render :json => {:error => "HTTP Token: Access denied."}, :status => :unauthorized 
end 
+2

Derzeit müssen Sie diese Funktion als 'request_http_token_authentication (realm = 'Application', message = nil) definieren'. –

+0

Mit "aktuell" meinst du Rails edge, @DiegoCouto? – berkes

+1

Das ist richtig @berkes! [Schau mal] (https://github.com/rails/rails/blob/master/actionpack/lib/action_controller/metal/http_authentication.rb#L422). Danke, dass Sie darauf hingewiesen haben, BTW. :-) –

Verwandte Themen