Mit einem POST'able API und Djangos CSRF Middleware
Frage
Ich habe eine Django Webapp, die beide haben eine Front-End, das Internet zugängliche Komponente und eine API, die von einem Desktop-Client zugegriffen wird. Aber jetzt mit der neuen CSRF Middleware-Komponente, API-Anfragen aus dem Desktop-Client, sind POST'ed ein 403 erhalten.
Ich verstehe, warum dies geschieht, aber was ist der richtige Weg, dies zu beheben, ohne die Sicherheit zu gefährden? Gibt es irgendwie kann ich im HTTP-Header signalisiert, dass es eine API-Anforderung und dass Django sollte nicht für CSRF checken oder ist das eine schlechte Strategie?
Bearbeiten -
Die Methode, die ich im Moment bin ist, dass das Desktop-Client einen Header setzt, X-Requested-With: XMLHttpRequest. Das ist ein bisschen hacky, aber ich bin nicht sicher, wie dies besser behandelt werden würde.
Lösung
Wie wäre es nur eine Sicht (en) für den Desktop-Client abspaltet und Dekorieren sie mit csrf_exempt ?
Andere Tipps
Wenn Sie eine Klasse Basierend Ansicht verwenden, dann müssen Sie den Versandweg csrf_exempt anstatt die post-Methode wie folgt aus:
@method_decorator(csrf_exempt)
def dispatch(self, request, *args, **kwargs):
return super(MyView, self).dispatch(request, *args, **kwargs)
diesen Fehler Ticket anzeigen: https://code.djangoproject.com/ticket/15794
Da Django 1.1 wird der CSRF-Code automatisch AJAX-Anfragen durchlassen, da Browser der richtigen Sicherheitskontrollen zu tun scheinen. Hier ist die Original verpflichten und die Dokumentation .