Qual método devo usar para uma solicitação de login (autenticação)?

95

Gostaria de saber qual método http devo usar ao fazer uma solicitação de login e por quê? Como essa solicitação cria um objeto (uma sessão de usuário) no servidor, acho que deveria ser POST, o que você acha? Mas como a solicitação de login deve ser idempotente, pode ser PUT, não é?

A mesma pergunta para uma solicitação de logout, devo usar o método DELETE?

greg0ire
fonte

Respostas:

79

Se sua solicitação de login for por meio de um usuário fornecendo um nome de usuário e uma senha, um POST é preferível, pois os detalhes serão enviados no corpo da mensagem HTTP em vez do URL. Embora ainda seja enviado em texto simples, a menos que você esteja criptografando via https.

O método HTTP DELETE é uma solicitação para excluir algo no servidor. Eu não acho que EXCLUIR uma sessão de usuário na memória é realmente o que se pretende; mais é para excluir o próprio registro do usuário. Portanto, o logout pode ser apenas um GET, por exemplo, www.yoursite.com/logout.

planetjones
fonte
1
Em relação ao pedido de login, acrescentei algo à minha pergunta dizendo que poderia ser PUT, não hesitei em GET. +1 para a resposta detalhada
greg0ire
1
ok - PUT está realmente criando algo no servidor, eu acho. Então, em um sentido RESTful, acho que é o que você PODERIA usar ao criar um novo usuário. E o usuário deve ser criado na URL que você especificar. No entanto, para algo que é realmente temporário, como uma sessão http, eu faria o login via POST.
planetjones
Acho que o fato de a sessão http ser transitória mostra seu ponto. Vou fazer o que você disse, obrigado.
greg0ire
16
Não concordo que LOGOUT deva ser GET porque simplesmente enviar um e-mail de usuário com a tag de imagem que tem seu atributo src como "www.yoursite.com/logout" fará o logout desse usuário.
Vytautas Butkus
2
GET não faz muito sentido. Outra entrada sobre isso pode ser encontrada aqui: stackoverflow.com/questions/3521290/logout-get-or-post
thasmo
40

Eu acredito que você pode traduzir os métodos LOGIN e LOGOUT em operações CRUD básicas CREATE & DELETE. Como você está criando um novo recurso chamado SESSION e o destruindo ao fazer logout:

  1. POST / login - cria sessão
  2. DELETE / logout - destrói a sessão

Eu nunca faria LOGOUT como GET só porque qualquer um poderia fazer um ataque simplesmente enviando um e-mail com a tag IMG ou link para um site onde essa tag IMG existe. ( <img src="youtsite.com/logout" />)

PS Há muito tempo que eu queria saber como você criaria um login / logout RESTful e descobri que é muito simples, você faz exatamente como eu descrevi: use / session / endpoint com os métodos CREATE e DELETE e você está bem. Você também pode usar o UPDATE se quiser atualizar a sessão de uma forma ou de outra ...

Vytautas Butkus
fonte
4
É quase tão fácil fazer uma solicitação DELETE quanto uma solicitação GET com ferramentas de navegador modernas, algumas das quais estão disponíveis diretamente no navegador, como emitir uma solicitação XHR diretamente do console do navegador. Ainda votado porque você falou sobre semântica, que também é importante, assim como banco de dados.
trysis
8

Aqui está minha solução com base em recomendações e guias REST:

LOGIN - criar um recurso

Solicitação:

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

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

Resposta:

http status code 201 (Created)

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

LOGOUT - excluir um recurso

Solicitação:

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

Resposta:

http status code 204 (No Content)
Ali Mamedov
fonte
3

Em relação ao método de logout:

Na documentação do Spring (Java Framework), eles afirmam que uma solicitação POST é preferida, uma vez que um GET o torna vulnerável a CSRF (Cross-Site Request Forgery) e o usuário pode ser desconectado.

Adicionar CSRF atualizará o LogoutFilter para usar apenas HTTP POST. Isso garante que o logoff exija um token CSRF e que um usuário mal-intencionado não possa forçar o logoff de seus usuários.

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

O login também deve usar POST (o corpo pode ser criptografado, veja as outras respostas).

DrunkenPope
fonte
2

Para solicitação de login, devemos usar o método POST. Porque nossos dados de login são seguros, o que precisa de segurança. Ao usar o método POST, os dados são enviados ao servidor em um pacote. Mas, no método GET, os dados são enviados ao servidor seguidos pela url, como anexar à solicitação de url, que será vista por todos.

Portanto, para um processo seguro de autenticação e autorização, devemos usar o método POST.

Espero que esta solução o ajude.

obrigado

Aman Goyal
fonte
1

Para Login eu uso POST, abaixo está o meu código para o método LOGIN eu usei Nodejs com Express e 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
fonte