Logout via POST request - wie umsetzen
![](/uploads/default_avatar/thumb/missing.png)
- javascript
Hallo,
ich habe gerade gelesen, dass es keine gute Idee ist, wenn der Logout via GET Request erfolgt. Man sollte POST oder DELETE Methode verwenden. Jetzt stellen sich für mich aber die Fragen für die cleint-seitige Umsetzung:
Welche Umsetzung ist sinnvoll, wenn der Logout durch Nutzeraktion ausgelöst werden soll --> <form> submit erscheint mir hier sinnvoll?
Wie kann man es lösen, wenn der Logout nicht durch Nutzeraktion ausgelöst werden soll. Zum Beispiel automatischer Logout bei Inaktivität von X Minuten? --> Zuerst einen fetch request senden und dann in Abhängigkeit der Antwort die URL der aktuellen Seite neu setzen. Also etwa so:
fetch(logoutURL, {method:'POST'}).then(res => res.json()).then(({redirectURL}) => {
window.location.href = redirectURL;
})
Hier stellt sich mir die Frage, ob es sicher ist, dass man direkt auf die redirectURL umleitet, die der Server als Antwort schickt. Aus meiner Sicht ja, wenn die logoutURL nicht manipuliert werden kann.
Wäre dankbar um EInschätzung, ob man es so umsetzen kann ... bevor ich am Server entsprechend ändere.
Gruss Michael
Lieber Michael_K,
ich habe gerade gelesen, dass es keine gute Idee ist, wenn der Logout via GET Request erfolgt.
und welche Begründung wurde dort (wo?) gegeben? Für mich ist gerade nicht klar, warum ein Logout via GET-Request so verkehrt sein sollte.
Man sollte POST oder DELETE Methode verwenden.
Ohne Begründung ist diese Aussage für mich völlig wertlos. Vermutlich kommt es wieder einmal auf die Einzelheiten an - wie so oft.
Jetzt stellen sich für mich aber die Fragen für die cleint-seitige Umsetzung:
Wenn der Nutzer sich aktiv abmelden will, benötigt er einen Button in einem Formular. Das ist ja wohl klar.
Wenn ein JavaScript nach einer Zeit der Inaktivität das Abmelden auslösen soll, dann wird es dieses Formular programmatisch absenden. Einen fetch()
kann man natürlich auch machen, aber dann muss man das Ergebnis irgendwie dem Benutzer kommunizieren. Da ist es sicherlich sinnvoller, das Formular an sich abzusenden. Vielleicht willst Du vorher noch dem Button einen besonderen Wert für sein value
-Attribut geben, damit die Logoutseite kommunizieren kann, dass die Abmeldung automatisch wegen eines Timeouts erfolgt ist?
Liebe Grüße
Felix Riesterer
Hallo Felix
Ohne Begründung ist diese Aussage für mich völlig wertlos. Vermutlich kommt es wieder einmal auf die Einzelheiten an - wie so oft.
Hätte ich in der Tat gleich verlinken können: Quelle
Ich kann diese Gründe nachvollziehen.
Und ja, bei einem Logout aufgrund von Inaktivität bekommt der Nutzer dies mitgeteilt.
Gruss Michael
Lieber Michael_K,
Hätte ich in der Tat gleich verlinken können: Quelle
in der Tat.
Ich kann diese Gründe nachvollziehen.
Die Diskussion geht in verschiedene Richtungen gleichzeitig. Dort wird von einer RESTful API gesprochen. Aus Sicht einer solchen ist das HTTP-Verb wesentlich. Es stellt sich aber die Frage, ob Deine Webanwendung eine solche API hat (oder braucht), denn innerhalb solcher Aufrufe kommt üblicherweise eine Authorisierung gleich mit, sodass es keinerlei Session-Mechanismus gibt, wo ein Logout benötigt werden könnte. Das nennt man dann zustandslos.
Wenn wir uns also nicht bei REST befinden, sondern bei einem ganz gewöhnlichen Session-basierten Zugriff, stellt sich die Frage inwiefern GET einen wesentlichen Nachteil gegenüber POST darstellt. Und genau hier liegt der Hase im Pfeffer: Prefetching. Wenn Dein Browser oder eine Erweiterung wie Antivierensoftware oder Webbeschleuniger sämtliche Links im Voraus lädt, dann hast Du ohnehin schon ein heftiges Problem an der Backe, denn die können im Zweifel auch POST.
Für mich stellt sich die Frage nicht, ob man GET oder POST zum Abmelden verwenden sollte. Aus meiner Sicht ist beides eine sinnvolle Lösung.
Und ja, bei einem Logout aufgrund von Inaktivität bekommt der Nutzer dies mitgeteilt.
Dann verstehe ich den Sinn Deines Postings nicht wirklich. Ging es Dir nur um eine inhaltliche Zusammenfassung der SO-Diskussion?
Liebe Grüße
Felix Riesterer
Hallo Felix,
eine Anforderung an GET ist, dass der Aufruf idempotent sein soll. D.h. ich kann einen GET Logout.php
Request einmal, dreimal oder 47 Mal machen und der Server ist danach immer noch im gleichen Zustand. DAS kann man für Logout noch gelten lassen. Dennoch ist es so, dass zwei aufeinander folgende LOGOUT-Gets nicht zu identischen Abläufen auf dem Server führen. Der erste beendet die Session, der zweite tut nichts oder läuft auf eine Fehlermeldung.
Es gibt aber noch zwei weitere Anforderungen: ein GET soll „safe“ und „cacheable“ sein. Ein Logout ist in diesem Sinne gerade nicht safe. Und es wäre echt Käse, wenn mein Browser den Logout-Request aus dem Cache beantwortet. Oder ein dazwischen liegender Varnish-Cache.
Also: GET ist semantisch schlichtweg das falsche Transportvehikel für einen Logout. Egal ob man es technisch irgendwie zum Funktionieren bringt oder nicht.
Rolf