Який метод слід використовувати для запиту на вхід (автентифікацію)?


93

Я хотів би знати, який метод http я повинен використовувати, коли роблю запит на вхід, і чому? Оскільки цей запит створює об'єкт (сеанс користувача) на сервері, я думаю, це повинен бути POST, що ви думаєте? Але оскільки запит на вхід повинен бути ідемпотентним, це може бути PUT, чи не так?

Те саме питання щодо запиту на вихід, чи слід використовувати метод DELETE?

Відповіді:


77

Якщо ваш запит на вхід здійснюється через користувача, який вводить ім’я користувача та пароль, то переважнішим є POST, оскільки деталі будуть надсилатися в тілі повідомлень HTTP, а не в URL. Хоча він все одно буде надісланий звичайним текстом, якщо ви не шифруєте через https.

Метод HTTP DELETE - це запит на видалення чогось із сервера. Я не думаю, що ВИДАЛЕННЯ сеансу користувача в пам’яті насправді передбачається; більше це для видалення самого запису користувача. Тож потенційно вихід із системи може бути просто GET, наприклад www.yoursite.com/logout.


1
Щодо запиту на вхід, я додав щось до свого запитання, сказавши, що це може бути PUT, я не вагався з GET. +1 для детальної відповіді
greg0ire

1
гаразд - PUT дійсно створює щось на сервері, я думаю. Отже, у ВІДКЛАДНОМ розумінні, я думаю, це те, що ви МОГЛИ використовувати, створюючи нового користувача. І користувача слід створити за вказаною вами URL-адресою. Однак для чогось, що насправді є тимчасовим, наприклад, сеанс http, тоді я ввійшов би через POST.
planetjones

Я думаю, що той факт, що сеанс http є тимчасовим, вказує на вашу думку. Я зроблю те, що ти сказав, дякую.
greg0ire

16
Я не згоден з тим, що LOGOUT має бути GET, оскільки, просто надіславши користувачеві електронне повідомлення з тегом зображення, який має атрибут src як "www.yoursite.com/logout", цей користувач вийде з системи.
Vytautas Butkus

2
GET не має особливого сенсу. Інший вхід на це можна знайти тут: stackoverflow.com/questions/3521290/logout-get-or-post
thasmo

37

Я вважаю, що ви можете перевести методи LOGIN & LOGOUT в основні операції CRUD CREATE & DELETE. Оскільки ви створюєте новий ресурс під назвою SESSION і знищуєте його при виході з системи:

  1. POST / login - створює сеанс
  2. DELETE / logout - знищує сеанс

Я б ніколи не робив LOGOUT as GET, тому що кожен міг здійснити атаку, просто надіславши електронне повідомлення з тегом IMG або посиланням на веб-сайт, де такий тег IMG існує. ( <img src="youtsite.com/logout" />)

PS Довгий час мені було цікаво, як би ви створили RESTful вхід / вихід, і виявилося, що це дійсно просто, ви робите це так само, як я описав: використовуйте / сеанс / кінцеву точку з методами CREATE та DELETE, і у вас все добре. Ви також можете використовувати UPDATE, якщо хочете оновити сесію тим чи іншим способом ...


4
Зробити запит DELETE майже так само просто, як запит GET, використовуючи сучасні інструменти браузера, деякі з яких доступні безпосередньо в браузері, наприклад, надсилання запиту XHR безпосередньо з консолі браузера. Все ще голосують, бо ви говорили про семантику, що також важливо, а також про базу даних.
триз

6

Ось моє рішення на основі посібників та рекомендацій REST:

ВХОД - створити ресурс

Запит:

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

BODY => {'login': 'login@example.com', 'password': '123456'}

Відповідь:

http status code 201 (Created)

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

LOGOUT - видалити ресурс

Запит:

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

Відповідь:

http status code 204 (No Content)

2

Щодо методу виходу з системи:

У документації Spring (Java Framework) вони вказують, що перевага надається запиту POST, оскільки GET робить вас вразливими до CSRF (міжсайтової підробки запитів), і користувач може вийти з системи.

Додавання CSRF оновить LogoutFilter, щоб використовувати лише HTTP POST. Це гарантує, що для виходу потрібен маркер CSRF, а зловмисний користувач не може примусово вийти з системи.

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

Для входу також слід використовувати POST (тіло можна зашифрувати, див. Інші відповіді).


0

Для запиту на вхід слід використовувати метод POST. Оскільки наші дані для входу захищені, що потребує захисту. При використанні методу POST дані надсилаються на сервер у комплекті. Але в методі GET дані надсилаються на сервер, а потім URL-адреса, як додаток із запитом URL-адреси, який буде бачити кожен.

Отже, для безпечного процесу автентифікації та авторизації ми повинні використовувати метод POST.

Сподіваюся, це рішення допоможе вам.

Дякую


0

Для входу я використовую POST, нижче мій код для методу LOGIN. Я використовував Nodejs з Express та 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}});



     }
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.