Jakiej metody należy użyć w przypadku żądania logowania (uwierzytelniania)?

93

Chciałbym wiedzieć, której metody http powinienem użyć podczas wykonywania żądania logowania i dlaczego? Ponieważ to żądanie tworzy obiekt (sesję użytkownika) na serwerze, myślę, że powinno to być POST, co o tym myślisz? Ale ponieważ żądanie logowania powinno być idempotentne, może to być PUT, prawda?

To samo pytanie w przypadku żądania wylogowania, czy powinienem użyć metody DELETE?

greg0ire
źródło

Odpowiedzi:

77

Jeśli żądanie logowania jest przesyłane przez użytkownika, który podał nazwę użytkownika i hasło, preferowany jest post, ponieważ szczegóły będą wysyłane w treści wiadomości HTTP, a nie w adresie URL. Chociaż nadal będzie wysyłany zwykły tekst, chyba że szyfrujesz przez https.

Metoda HTTP DELETE to żądanie usunięcia czegoś na serwerze. Nie sądzę, że USUWANIE sesji użytkownika w pamięci jest naprawdę tym, co jest zamierzone; więcej służy do usuwania samego rekordu użytkownika. Więc potencjalnie wylogowanie może być po prostu GET, np. Www.yoursite.com/logout.

planetjones
źródło
1
Jeśli chodzi o żądanie logowania, dodałem coś do mojego pytania, mówiąc, że może to być PUT, nie wahałem się z GET. +1 za szczegółową odpowiedź
greg0ire
1
ok - myślę, że PUT naprawdę tworzy coś na serwerze. Więc w RESTful sensie myślę, że właśnie tego MOŻESZ użyć, tworząc nowego użytkownika. Użytkownik powinien zostać utworzony pod określonym przez Ciebie adresem URL. Jednak w przypadku czegoś, co jest naprawdę przejściowe, jak sesja http, logowałbym się przez POST.
planetjones
Myślę, że fakt, że sesja http jest przejściowa, ma znaczenie. Zrobię, jak powiedziałeś, dzięki.
greg0ire
16
Nie zgadzam się, że LOGOUT powinien być GET, ponieważ zwykłe wysłanie e-maila użytkownika ze znacznikiem obrazu, który ma atrybut src jako „www.yoursite.com/logout” spowoduje wylogowanie tego użytkownika.
Vytautas Butkus
2
GET nie ma większego sensu. Inne informacje na ten temat można znaleźć tutaj: stackoverflow.com/questions/3521290/logout-get-or-post
thasmo
37

Uważam, że możesz przełożyć metody LOGIN & LOGOUT na podstawowe operacje CRUD CREATE & DELETE. Ponieważ tworzysz nowy zasób o nazwie SESSION i niszczysz go podczas wylogowywania:

  1. POST / login - tworzy sesję
  2. DELETE / logout - niszczy sesję

Nigdy nie zrobiłbym LOGOUT as GET tylko dlatego, że każdy mógłby przeprowadzić atak po prostu wysyłając wiadomość e-mail z tagiem IMG lub linkiem do strony internetowej, na której taki tag IMG istnieje. ( <img src="youtsite.com/logout" />)

PS Przez długi czas zastanawiałem się, jak stworzyć RESTful login / logout i okazało się, że to naprawdę proste, robisz to tak, jak opisałem: użyj / session / endpoint z metodami CREATE i DELETE i wszystko jest w porządku. Możesz także użyć UPDATE, jeśli chcesz zaktualizować sesję w taki czy inny sposób ...

Vytautas Butkus
źródło
4
Wykonanie żądania DELETE jest prawie tak proste, jak żądanie GET za pomocą nowoczesnych narzędzi przeglądarki, z których niektóre są dostępne bezpośrednio w przeglądarce, na przykład wysyłanie żądania XHR bezpośrednio z konsoli przeglądarki. Nadal głosowano za, ponieważ mówiłeś o semantyce, która również jest ważna, a także o bazie danych.
trysis
6

Oto moje rozwiązanie oparte na przewodnikach i rekomendacjach REST:

LOGIN - utwórz zasób

Żądanie:

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

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

Odpowiedź:

http status code 201 (Created)

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

LOGOUT - usuń zasób

Żądanie:

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

Odpowiedź:

http status code 204 (No Content)
Ali Mamedov
źródło
2

Odnośnie sposobu wylogowania:

W dokumentacji Spring (Java Framework) stwierdzają, że preferowane jest żądanie POST, ponieważ GET naraża Cię na CSRF (Cross-Site Request Forgery), a użytkownik może zostać wylogowany.

Dodanie CSRF zaktualizuje LogoutFilter, aby używał tylko protokołu HTTP POST. Gwarantuje to, że wylogowanie wymaga tokenu CSRF, a złośliwy użytkownik nie może wymusić wylogowania użytkowników.

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

Logując się również należy użyć POST (treść może być zaszyfrowana, zobacz pozostałe odpowiedzi).

DrunkenPope
źródło
0

Do logowania powinniśmy użyć metody POST. Ponieważ nasze dane logowania są bezpieczne, co wymaga bezpieczeństwa. W przypadku metody POST dane przesyłane są na serwer w paczce. Ale w metodzie GET dane są wysyłane na serwer, a następnie adres URL, taki jak dołączony do żądania url, który będzie widoczny dla wszystkich.

Dlatego dla bezpiecznego procesu uwierzytelniania i autoryzacji powinniśmy używać metody POST.

Mam nadzieję, że to rozwiązanie Ci pomoże.

Dzięki

Aman Goyal
źródło
0

Do logowania używam POST, poniżej jest mój kod do metody LOGIN, której użyłem Nodejs z Express i 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
źródło