Welche Methode sollte ich für eine Anmeldeanforderung (Authentifizierung) verwenden?

90

Ich möchte wissen, welche http-Methode ich bei einer Anmeldeanforderung verwenden soll und warum? Da diese Anfrage ein Objekt (eine Benutzersitzung) auf dem Server erstellt, sollte es meiner Meinung nach POST sein. Was denken Sie? Aber da die Anmeldeanforderung idempotent sein sollte, könnte es PUT sein, nicht wahr?

Gleiche Frage für eine Abmeldeanforderung, sollte ich die DELETE-Methode verwenden?

greg0ire
quelle

Antworten:

73

Wenn Ihre Anmeldeanforderung über einen Benutzer erfolgt, der einen Benutzernamen und ein Kennwort angibt, ist ein POST vorzuziehen, da Details im HTTP-Nachrichtentext und nicht in der URL gesendet werden. Es wird zwar weiterhin nur Text gesendet, es sei denn, Sie verschlüsseln über https.

Die HTTP DELETE-Methode ist eine Anforderung, etwas auf dem Server zu löschen. Ich denke nicht, dass das LÖSCHEN einer In-Memory-Benutzersitzung wirklich das ist, was beabsichtigt ist. mehr noch, um den Benutzerdatensatz selbst zu löschen. Das potenzielle Abmelden kann also nur ein GET sein, z. B. www.yoursite.com/logout.

planetjones
quelle
1
In Bezug auf die Anmeldeanforderung habe ich meiner Frage etwas hinzugefügt, das besagt, dass es sich um PUT handeln könnte. Ich habe bei GET nicht gezögert. +1 für die detaillierte Antwort
greg0ire
1
ok - PUT erstellt wirklich etwas auf dem Server, denke ich. Im wahrsten Sinne des Wortes KÖNNTE ich das verwenden, wenn Sie einen neuen Benutzer erstellen. Der Benutzer sollte unter der von Ihnen angegebenen URL erstellt werden. Für etwas, das wirklich vorübergehend ist, wie eine http-Sitzung, würde ich mich jedoch über POST anmelden.
Planetjones
Ich denke, die Tatsache, dass die http-Sitzung vorübergehend ist, macht Ihren Standpunkt. Ich werde tun, was du gesagt hast, danke.
Greg0ire
15
Ich bin nicht der Meinung, dass LOGOUT GET sein sollte, da durch einfaches Senden einer Benutzer-E-Mail mit einem Image-Tag, dessen src-Attribut "www.yoursite.com/logout" lautet, dieser Benutzer abgemeldet wird.
Vytautas Butkus
2
GET macht nicht viel Sinn. Eine weitere Eingabe hierzu finden Sie hier: stackoverflow.com/questions/3521290/logout-get-or-post
thasmo
35

Ich glaube, dass Sie LOGIN & LOGOUT-Methoden in grundlegende CRUD-Operationen CREATE & DELETE übersetzen können. Da Sie eine neue Ressource namens SESSION erstellen und diese beim Abmelden zerstören:

  1. POST / Login - Erstellt eine Sitzung
  2. LÖSCHEN / Abmelden - zerstört die Sitzung

Ich würde LOGOUT niemals als GET ausführen, nur weil jeder einen Angriff ausführen könnte, indem er einfach eine E-Mail mit einem IMG-Tag oder einen Link zu einer Website sendet, auf der ein solches IMG-Tag vorhanden ist. ( <img src="youtsite.com/logout" />)

PS Lange habe ich mich gefragt, wie Sie ein RESTful-Login / Logout erstellen würden, und es stellte sich heraus, dass es wirklich einfach ist. Sie tun es genau so, wie ich es beschrieben habe: Verwenden Sie / session / endpoint mit den Methoden CREATE und DELETE, und es geht Ihnen gut. Sie können auch UPDATE verwenden, wenn Sie die Sitzung auf die eine oder andere Weise aktualisieren möchten ...

Vytautas Butkus
quelle
4
Es ist fast so einfach, eine DELETE-Anforderung wie eine GET-Anforderung mit modernen Browser-Tools auszuführen, von denen einige direkt im Browser verfügbar sind, z. B. das Ausgeben einer XHR-Anforderung direkt über die Browserkonsole. Immer noch positiv bewertet, weil Sie über Semantik, die ebenfalls wichtig ist, sowie über Datenbank gesprochen haben.
Tryse
6

Hier ist meine Lösung basierend auf REST-Anleitungen und Empfehlungen:

ANMELDEN - Erstellen Sie eine Ressource

Anfrage:

POST => https://example.com/sessions/

BODY => {'login': '[email protected]', 'password': '123456'}

Antwort:

http status code 201 (Created)

{'token': '761b69db-ace4-49cd-84cb-4550be231e8f'}

LOGOUT - Löscht eine Ressource

Anfrage:

DELETE => https://example.com/sessions/761b69db-ace4-49cd-84cb-4550be231e8f/

Antwort:

http status code 204 (No Content)
Ali Mamedov
quelle
2

In Bezug auf die Methode zum Abmelden:

In der Spring-Dokumentation (Java Framework) wird angegeben, dass eine POST-Anforderung bevorzugt wird, da ein GET Sie für CSRF (Cross-Site Request Forgery) anfällig macht und der Benutzer abgemeldet werden kann.

Durch Hinzufügen von CSRF wird der LogoutFilter so aktualisiert, dass nur HTTP POST verwendet wird. Dadurch wird sichergestellt, dass für die Abmeldung ein CSRF-Token erforderlich ist und ein böswilliger Benutzer Ihre Benutzer nicht zwangsweise abmelden kann.

Siehe: https://docs.spring.io/spring-security/site/docs/current/reference/html/web-app-security.html#csrf-logout

Bei der Anmeldung sollte auch POST verwendet werden (der Text kann verschlüsselt werden, siehe die anderen Antworten).

DrunkenPope
quelle
0

Für die Anmeldeanforderung sollten wir die POST-Methode verwenden. Weil unsere Anmeldedaten sicher sind und Sicherheit benötigen. Bei Verwendung der POST-Methode werden die Daten in einem Bundle an den Server gesendet. Bei der GET-Methode werden jedoch Daten an den Server gesendet, gefolgt von einem URL-ähnlichen Anhang mit einer URL-Anforderung, der für alle sichtbar ist.

Für einen sicheren Authentifizierungs- und Autorisierungsprozess sollten wir die POST-Methode verwenden.

Ich hoffe, diese Lösung wird Ihnen helfen.

Vielen Dank

Aman Goyal
quelle
0

Für die Anmeldung verwende ich POST. Unten ist mein Code für die LOGIN-Methode, die ich mit Nodejs mit Express und Mongoose verwendet habe

your router.js
     const express = require("express");
     const router = express.Router();

     router.post("/login", login);

your controller.js
     export.login = async(req, res) => {
         //find the user based on email
         const {email, password} = req.body; 

           try{
                const user =  awaitUser.findOne({email});
                if(user==null) 
                 return res.status(400).json({err : "User with 
                         email doesnot exists.Please signup"});
          }
           catch(error){
                 return res.status(500).json({err : 
                                     error.message});
               }

         //IF EVERYTHING GOES FINE, ASSIGN YOUR TOKEN
          make sure you have JWT installed 
         const token = jwt.sign({_id: user._id}, YOUR_SECRET_KEY);

         res.cookie('t');

         const {_id, name, email} = user;
         return res.json({token, user : {_id, email, name}});



     }
xSachinx
quelle