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?

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.


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 ...


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': 'login@example.com', '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)

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).


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


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}});



     }
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.