Передача POST данных через fetch в JavaScript

В прошлой статье "Передача GET параметра через fetch в JavaScript" мы упомянули, что нельзя передавать чувствительные данные через GET параметры. К примеру, логин и пароль пользователя из формы авторизации. Но в при передаче методом POST можно не опасаться, что данные будут перехвачены злоумышленниками.

В этой статье попробуем реализовать часть функции авторизации на сайте. А точнее часть с передачей данных методом POST через функцию fetch с AJAX запросом. Для этого сначала сделаем саму форму, в которой будет вводиться пароль и логин. При этом попробуем реализовать JS скрипт для входа, но сначала только с GET запросом:
<!DOCTYPE html>
<html>
   <head>
      <title>Форма авторизации</title>
   </head>
   <body>
      <form>
         <input type="text" name="login" id="login" placeholder="Логин">
         <input type="text" name="pass" id="pass" placeholder="Пароль">
         <span onclick="login()">Войти</span>
      </form>
      <div id="result"></div>
      <script>
         function login(){
            var login = document.getElementById('login').value;
            var pass = document.getElementById('pass').value;

            fetch('/login_ajax.php?login=' + login + '&pass=' + pass).then(
               response => {
                  return response.text();
               }
            ).then(
               text => {
                  document.getElementById('result').innerHTML = text;
               }
            );
         }
      </script>
   </body>
</html>
Если загрузить страницу с такой формой, то можно увидеть два текстовых поля для ввода: "логин" и "пароль". Ниже будет надпись "войти", которая является кнопкой, то есть на неё можно кликнуть курсором мыши и произойдёт попытка отправить данные из текстовых полей на страницу /login_ajax.php. Как можно заметить, к адресу страницы ещё добавляются GET параметры, значения которых берётся из текстовых полей.

Теперь необходимо сделать скрипт, который будет находиться в файле /login_ajax.php. В нём будет примитивный механизм "авторизации". По сути это будет код, который всего лишь возвращает текст "Пароль верный" и "Неправильный пароль!". Выглядеть скрипт будет так:
<?php
if($_GET['login'] == 'mouse' && $_GET['login'] == 'cheese'){
   echo 'Пароль верный';
}else{
   echo 'Неправильный пароль!';
}
Теперь попробуем протестировать весь пример. Откройте форму, наберите логин "mouse", а пароль "cheese". Отправьте данные, кликнув на надпись "Войти" рядом с текстовыми полями. Результат обработки запроса появится в под текстовыми полями (отобразится фраза "Пароль верный").

Но как решили раньше, переделаем пример, чтобы данные отправлялись методом POST. Это нужно для безопасности, потому что такие данные шифруются в отличии от GET параметров (во всяком случае, с сертификатом TLS < 1.3, но могут ещё что-нибудь изобрести...). Для этого нужно воспользоваться вторым параметром функции fetch и узнать, в который можно передать объект с настройками запроса.

Одним из свойств этого метода является "method" (буквально как атрибут тега form). В него можно записать либо 'GET', либо 'POST'. Но на этом нам нельзя ограничиваться, нужно ещё и передать в этот объект переменные запроса. Делается это с помощью свойства "body". В него предаётся объекты класса URLSearchParams, в которых содержатся переменные и их значения. Попробуем продемонстрировать на маленьком примере, вырезанном из нашего кода:
var params = new URLSearchParams('login=' + login + '&pass=' + pass); 

fetch('/login_ajax.php', {
   method: 'POST',
   body: params
});
Как можно заметить по куску кода 'login=' + login + '&pass=' + pass мы поставили в объект URLSearchParams те же самые параметры, которые раньше передавали через GET запрос. И они переданы одним куском, но часто бывает, что некоторые параметры нужно передавать только при особом условии. Для этого можно воспользоваться методом "set" объекта URLSearchParams, чтобы добавлять новые значения в него. Перепишем наш код в эквивалентный:
var params = new URLSearchParams(); 
params.set('login', login);
params.set('pass', pass);

fetch('/login_ajax.php', {
   method: 'POST',
   body: params
});
Этот код делает то же самое, что и предыдущий. Но в случае необходимости, к примеру, легче сделать добавление параметра по условию:

if(a==1) params.set('pass', pass);
Теперь перепишем код основного примера, чтобы он заработал через метод POST:
<!DOCTYPE html>
<html>
   <head>
      <title>Форма авторизации</title>
   </head>
   <body>
      <form>
         <input type="text" name="login" id="login" placeholder="Логин">
         <input type="text" name="pass" id="pass" placeholder="Пароль">
         <span onclick="login()">Войти</span>
      </form>
      <div id="result"></div>
      <script>
         function login(){
            var login = document.getElementById('login').value;
            var pass = document.getElementById('pass').value;

            var params = new URLSearchParams(); 
            params.set('login', login);
            params.set('pass', pass);

            fetch('/login_ajax.php', {
               method: 'POST',
               body: params
            }).then(
               response => {
                  return response.text();
               }
            ).then(
               text => {
                  document.getElementById('result').innerHTML = text;
               }
            );
         }
      </script>
   </body>
</html>
И не забудем, что нужно изменить все переменные $_GET на $_POST в файле обработчика:
<?php
if($_POST['login'] == 'mouse' && $_POST['login'] == 'cheese'){
   echo 'Пароль верный';
}else{
   echo 'Неправильный пароль!';
}
Теперь запрос происходит методом POST и можно не бояться за сохранность данных (конечно, если сайт работает с шифрованием, то есть через httpS)
MouseDC.ru - хостинг, виртуальный хостинг, покупка доменов, проверка доменов, WHOIS, курсы создания сайтов, вебинары по созданию, курсы разработки сайтов, доработка сайтов, сопровождение сайтов, разработка сайтов, техподдержка сайтов
Cмотрите другие статьи:
Была ли статья полезной?
Была ли эта статья полезна? Есть вопрос?
хостинг для сайтов
Закажите недорогой хостинг Заказать

всего от 290 руб

⇡ наверх