Ich arbeite an einer App, wo Server und der api-konsumierenden Client unter verschiedenen Domänen residieren, also möchte ich CORS verwenden. Um dies zu tun, muß ich entsprechende HTTP-Header in der Server-Antwort festgelegt:So senden Sie CORS-Header mit Devise, wenn Benutzer nicht autorisiert (401 Antwort)
def cors_set_access_control_headers
headers['Access-Control-Allow-Origin'] = 'http://localhost'
headers['Access-Control-Allow-Methods'] = 'POST, GET, OPTIONS'
headers['Access-Control-Allow-Headers'] = '*, X-Requested-With, X-Prototype-Version, X-CSRF-Token, Content-Type'
headers['Access-Control-Max-Age'] = "1728000"
end
diese Methode als before_filter
in ApplicationController
verwendet wird.
Für einige Ressourcen muss der Benutzer authentifiziert und autorisiert werden. Anfragen werden über XHR/Ajax erledigt. Wenn der Benutzer also nicht authentifiziert wird, sendet Devise eine 401-Antwort an den Client, anstatt auf eine Anmeldeseite umzuleiten. Aber der Filter zum Setzen der CORS-Header wird nicht für diese Antwort verwendet. Daher wird die 401-Antwort nicht an den Client gesendet. Ich möchte die 401-Antwort im Client erfassen und verwenden.
Derzeit bin ich eine Abhilfe, indem nicht die Devise Authentifizierungsmethoden verwenden, sondern eine benutzerdefinierte Auth-Schnipsel:
def authenticate_cors_user
if request.xhr? && !user_signed_in?
error = { :error => "You must be logged in." }
render params[:format].to_sym => error, :status => 401
end
end
Dies als before_filter
in ApplicationController
auch gesetzt ist. Auf diese Weise wird der Filter zum Setzen von CORS-Headern ausgelöst und alles funktioniert einwandfrei.
Ich würde lieber das Standardverhalten von Devise verwenden, aber die CORS-Header müssten in der 401-Antwort gesetzt werden. Wie macht man das? Muss ich dafür warden konfigurieren?
Wie können die CORS-Header für die von Devise generierte 401-Antwort festgelegt werden, anstatt eine eigene Antwort zu erstellen?
Noch ich keine Lösung dafür. Um etwas mehr Kontext zu geben, schaue in meinem Blogpost darüber nach, wie ich das benutze: http://nils-blum-oesteth.net/cors-api-with-oauth2-authentication-using-rails-and-angularjs –