Flask & Vue. Проста аутентифікація. Приклад№ 2.4


04.05.2021

В цій статті: Проста аутентифікація

Коли потрібно пускати юзерів в приложуху тільки по логіну та паролю, це можна зробити декількома шляхами.

  • Користувач вводить логін/пароль, ці дані зберігаються десь в додатку, і кожного разу надсилаються з запитом на сервер.

Дурня повна! Ніхто зараз так не робить, бо легко поцупити логін/пароль. Тому:

  • Користувач вводить логін/пароль один раз і відправляє на сервер. Той перевіряє чи дійсно існує такий користувач і якщо все гаразд - надсилає в відповідь унікальну ID сесії користувача. І далі додаток додає цей ID сесії в всі запити до сервера. Далі я буду його називати токен (Token), хоча це не зовсім те, що насправді називають токеном. Саме за цим токеном можна визначити що це за користувач. Додаток зберігає Token десь в куках або localstorage і поки існує Token, доти користувач вважається залогіненим.

Та це проблема, бо маючи доступ до компа, на якому залогінився юзер, можна легко поцупити токен і, використавши його на іншому компі, попасти в систему навіть не знаючи логіна/пароля. Це проблема! Тому:

  • Токен видається з прив'язкою до конкретного девайса. В такому випадку використання токена на іншому пристрої буде неможливим. Для того, щоб згенерувати унікальний ідентифікатор пристрою я використав в прикладі Fingerprint. Дивись файл sessionid.min.js. Це Fingerprint, але перейменований. Цього достатньо, щоб обійти блокування Fingerprint :) в браузерах, який вважають інструментом для слідкування. Тепер при кожному запиті до сервера відправляється "token" і Fingerprint, який я обізвав "sessionid". Сервер перевіряє відповідність sessionid і token.

Та от холера! Маючи доступ до компа, де залогінився юзер, можна ж і Fingerprint легко зтибрити. Потім, зі збоченнями, але ж таки використати його і токен, щоб отримати несанкційований доступ. Тому:

  • Сервер має перевіряти не тільки згенерячений JS-скриптиком ID-девайса, але і ще щось, що змінити важко. В прикладі я аналізую User-Agent. Та і User-Agent теж можна підробити.

IP адресу для ідентифікації пристрою я не використовував, бо вона може бути динамічною, наприклад на мобільних пристроях. Тобто, зробити так, щоб сервер дійсно отримав ідентифікатор девайса, який складно підробити, та ще задачка. Тому:

  • Сервер видає token на певний час. І, коли активність користувача припиняється, через встановлений час токен видаляється. Користувачеві доведеться вводити пароль знову.

В цьому прикладі реалізована така собі проста схема Аутентифікації. Список користувачів в базі даних, таблиця USERS (дивись файл modifyDB.py, цей файл можна запустити для модифікації бази даних з попереднього прикладу).

Додані користувачі: admin/admin, user/123

В цьому прикладі на фронтенді реалізована форма логіну, збереження токена в localstorage, переадресація на відповідну сторінку після логіну.

Коли є підозра, що був витік інформації і логін + пароль став відомий зловмисникам, звісно, треба змінити пароль. Але, якщо зловмисник встиг увійти в систему на іншому пристрої, отримав токен, тоді зміна пароля не "викине" його з системи. Для розв'язання подібних проблем існує пункт меню "Logout all user's devices". Саме завдяки йому, можна видалити всі токени, які були видані поточному користувачеві.

Але так вже ніхто не робить - цей підхід досить застарілий. Проте, поки що будемо використовувати його. Зараз нам треба займатися Фронтендом. Потім, звісно, буде приклад з використанням jwt токенів. Такий підхід ускладнює побудову і роботу розподілених систем, коли існує єдиний сервер аутентифікації і багато серверів з додатками. І всі ці сервери додатків мають перевіряти токен в сервера аутентифікації. Це додатково навантажує сервер аутентифікації і несе загрозу для працездатності системи в цілому, якщо виникають проблеми доступу до сервера аутентифікації. Як я казав, надалі буде розглянуто приклад з використанням сучасних інструментів.

Мета цього прикладу познайомити читача з проблемами аутентифікації, дивлячись з боку фронтенда, та вималювати проблемами безпеки.

P.S. В наступній статті: Авторизація користувачів.

Як запустити приклад?

  1. Завантажити архів з прикладом, розпакувати
  2. Запустити приклад командою:
    python ./my_app.py
    або
    python3 ./my_app.py
  3. В браузері відкрити посилання: http://localhost:5000/

Дивись також:

Web-dev склерозник
Коментарі:
Додати коментар
Code
* - обов'язкові поля

Архіви