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

93

Я хотел бы знать, какой метод http мне следует использовать при выполнении запроса на вход и почему? Поскольку этот запрос создает объект (сеанс пользователя) на сервере, я думаю, что это должен быть POST, как вы думаете? Но поскольку запрос на вход в систему должен быть идемпотентным, он может быть PUT, не так ли?

Тот же вопрос для запроса на выход, следует ли использовать метод DELETE?

greg0ire
источник

Ответы:

77

Если ваш запрос на вход осуществляется через пользователя, указывающего имя пользователя и пароль, то предпочтительнее использовать POST, так как детали будут отправлены в теле сообщения HTTP, а не в URL-адресе. Хотя он все равно будет отправляться в виде обычного текста, если вы не шифруете через https.

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

PlanetJones
источник
1
Что касается запроса на вход, я добавил кое-что к своему вопросу, сказав, что это может быть PUT, я не колебался с GET. +1 за развернутый ответ
greg0ire 03
1
хорошо - я думаю, PUT действительно что-то создает на сервере. Итак, в смысле RESTful, я думаю, это то, что вы МОЖЕТЕ использовать при создании нового пользователя. И пользователь должен быть создан по указанному вами URL. Однако для чего-то действительно временного, например, сеанса http, я должен войти в систему через POST.
planetjones
Я думаю, что тот факт, что сеанс http временный, подчеркивает вашу точку зрения. Я сделаю, как ты сказал, спасибо.
greg0ire
16
Я не согласен с тем, что LOGOUT должен быть GET, потому что простая отправка электронного письма пользователя с тегом изображения, имеющим атрибут src как «www.yoursite.com/logout», приведет к выходу этого пользователя из системы.
Витаутас Буткус
2
GET не имеет особого смысла. Еще один
ответ по этому поводу
37

Я считаю, что вы можете перевести методы LOGIN & LOGOUT в базовые операции CRUD CREATE & DELETE. Поскольку вы создаете новый ресурс с именем SESSION и уничтожаете его при выходе из системы:

  1. POST / login - создает сеанс
  2. DELETE / logout - уничтожает сессию

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

PS Долгое время мне было интересно, как бы вы создали RESTful вход / выход, и оказалось, что это действительно просто, вы делаете это так же, как я описал: используйте / session / endpoint с методами CREATE и DELETE, и все в порядке. Вы также можете использовать UPDATE, если хотите так или иначе обновить сеанс ...

Витаутас Буткус
источник
4
Выполнить запрос DELETE почти так же легко, как и запрос GET, с помощью современных инструментов браузера, некоторые из которых доступны прямо в браузере, например, отправить запрос XHR непосредственно из консоли браузера. Все еще за то, что вы говорили о семантике, которая также важна, а также о базе данных.
trysis
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'}

ВЫХОД - удалить ресурс

Запрос:

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



     }
xSachinx
источник