Quelle méthode dois-je utiliser pour une demande de connexion (authentification)?

93

J'aimerais savoir quelle méthode http dois-je utiliser lors d'une demande de connexion, et pourquoi? Puisque cette demande crée un objet (une session utilisateur) sur le serveur, je pense que cela devrait être POST, qu'en pensez-vous? Mais comme la demande de connexion doit être idempotente, elle pourrait être PUT, n'est-ce pas?

Même question pour une demande de déconnexion, dois-je utiliser la méthode DELETE?

Greg0ire
la source

Réponses:

77

Si votre demande de connexion se fait via un utilisateur fournissant un nom d'utilisateur et un mot de passe, un POST est préférable, car les détails seront envoyés dans le corps des messages HTTP plutôt que dans l'URL. Bien qu'il soit toujours envoyé en texte brut, sauf si vous chiffrez via https.

La méthode HTTP DELETE est une demande de suppression de quelque chose sur le serveur. Je ne pense pas que SUPPRIMER une session utilisateur en mémoire soit vraiment ce que c'est prévu; de plus, c'est pour supprimer l'enregistrement utilisateur lui-même. Ainsi, la déconnexion potentielle peut être juste un GET, par exemple www.yoursite.com/logout.

planetjones
la source
1
Concernant la demande de connexion, j'ai ajouté quelque chose à ma question en disant que ça pourrait être PUT, je n'ai pas hésité avec GET. +1 pour la réponse détaillée
greg0ire
1
ok - PUT crée vraiment quelque chose sur le serveur je pense. Donc, dans un sens REST, je suppose que c'est ce que vous POUVEZ utiliser si vous créez un nouvel utilisateur. Et l'utilisateur doit être créé à l'URL que vous spécifiez. Cependant, pour quelque chose qui est vraiment transitoire comme une session http, alors je me connecte via POST.
planetjones
Je pense que le fait que la session http soit transitoire justifie votre point de vue. Je vais faire ce que vous avez dit, merci.
greg0ire
16
Je ne suis pas d'accord avec le fait que LOGOUT devrait être GET car le simple fait d'envoyer un e-mail d'utilisateur avec une balise d'image qui a son attribut src comme "www.yoursite.com/logout" déconnectera cet utilisateur.
Vytautas Butkus
2
GET n'a pas beaucoup de sens. Une autre entrée à ce sujet peut être trouvée ici: stackoverflow.com/questions/3521290/logout-get-or-post
thasmo
37

Je crois que vous pouvez traduire les méthodes LOGIN & LOGOUT en opérations CRUD de base CREATE & DELETE. Puisque vous créez une nouvelle ressource appelée SESSION et que vous la détruisez lors de la déconnexion:

  1. POST / login - crée une session
  2. DELETE / logout - détruit la session

Je ne ferais jamais de LOGOUT en tant que GET simplement parce que n'importe qui pourrait faire une attaque simplement en envoyant un e-mail avec une balise IMG ou un lien vers un site Web où une telle balise IMG existe. ( <img src="youtsite.com/logout" />)

PS Pendant longtemps, je me demandais comment créer une connexion / déconnexion RESTful et il s'est avéré que c'était vraiment simple, vous le faites comme je l'ai décrit: utilisez / session / endpoint avec les méthodes CREATE et DELETE et tout va bien. Vous pouvez également utiliser UPDATE si vous souhaitez mettre à jour la session d'une manière ou d'une autre ...

Vytautas Butkus
la source
4
Il est presque aussi facile de faire une requête DELETE qu'une requête GET avec des outils de navigateur modernes, dont certains sont disponibles directement dans le navigateur, comme l'émission d'une requête XHR directement depuis la console du navigateur. Encore voté parce que vous avez parlé de sémantique, qui est également importante, ainsi que de base de données.
trysis le
6

Voici ma solution basée sur les guides et recommandations REST:

LOGIN - créer une ressource

Demande:

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

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

Réponse:

http status code 201 (Created)

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

LOGOUT - supprimer une ressource

Demande:

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

Réponse:

http status code 204 (No Content)
Ali Mamedov
la source
2

Concernant la méthode de déconnexion:

Dans la documentation Spring (Java Framework), ils indiquent qu'une requête POST est préférée, car un GET vous rend vulnérable à CSRF (Cross-Site Request Forgery) et l'utilisateur peut être déconnecté.

L'ajout de CSRF mettra à jour LogoutFilter pour n'utiliser que HTTP POST. Cela garantit que la déconnexion nécessite un jeton CSRF et qu'un utilisateur malveillant ne peut pas déconnecter de force vos utilisateurs.

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

La connexion doit également utiliser POST (le corps peut être chiffré, voir les autres réponses).

IvrePape
la source
0

Pour la demande de connexion, nous devons utiliser la méthode POST. Parce que nos données de connexion sont sécurisées, ce qui nécessite une sécurité. Lorsque vous utilisez la méthode POST, les données sont envoyées au serveur dans un ensemble. Mais dans la méthode GET, les données sont envoyées au serveur, suivies de l'url comme ajouter avec une demande d'url qui sera vue par tout le monde.

Donc, pour un processus d'authentification et d'autorisation sécurisé, nous devons utiliser la méthode POST.

J'espère que cette solution vous aidera.

Merci

Aman Goyal
la source
0

Pour la connexion, j'utilise POST, voici mon code pour la méthode LOGIN que j'ai utilisé Nodejs avec Express et Mongoose

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
la source