Flask & Vue. Проста аутентифікація. Приклад№ 2.4
- Користувач вводить логін/пароль, ці дані зберігаються десь в додатку, і кожного разу надсилаються з запитом на сервер.
Дурня повна! Ніхто зараз так не робить, бо легко поцупити логін/пароль. Тому:
- Користувач вводить логін/пароль один раз і відправляє на сервер. Той перевіряє чи дійсно існує такий користувач і якщо все гаразд - надсилає в відповідь унікальну 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 токенів. Такий підхід ускладнює побудову і роботу розподілених систем, коли існує єдиний сервер аутентифікації і багато серверів з додатками. І всі ці сервери додатків мають перевіряти токен в сервера аутентифікації. Це додатково навантажує сервер аутентифікації і несе загрозу для працездатності системи в цілому, якщо виникають проблеми доступу до сервера аутентифікації. Як я казав, надалі буде розглянуто приклад з використанням сучасних інструментів.
Мета цього прикладу познайомити читача з проблемами аутентифікації, дивлячись з боку фронтенда, та вималювати проблемами безпеки.
Як запустити приклад?
- Завантажити архів з прикладом, розпакувати
- Запустити приклад командою:
абоpython ./my_app.pypython3 ./my_app.py - В браузері відкрити посилання: http://localhost:5000/
Дивись також:
- Flask & Vue. Приклад# 2.1
- Flask & Vue. Приклад# 2.2 Frontend - Зручна навігація
- Flask & Vue. Приклад# 2.3 Серверна пагінація, пошук, сортування даних
- Flask & Vue. Приклад# 2.4 Проста аутентифікація
- Flask & Vue. Приклад# 2.5 Авторизація
- Flask & Vue. Приклад# 2.6 Кастомні компоненти
- Flask & Vue. Приклад# 2.7 SQLAlchemy, Migrate, Marshmallow, JWT
- Flask & Vue. Використання систем збірки проекту. Webpack
- Flask & Vue. OAuth. Facebook / Google Account
- Flask & Vue. Завантаження файлів
Tags
bme280 bmp280 gps mpu-6050 options stm32 ssd1331 ssd1306 eb-500 3d-printer soldering tim mpu-9250 dma watchdog piezo exti web raspberry-pi docker ngnix solar bluetooth foc html css brushless flask dc-dc capture gpio avr rs-232 mpx4115a atmega mongodb st-link barometer pwm nvic git java-script programmator dht11 hih-4000 pmsm encoder max1674 smd sensors rtc adc lcd motor timer meteo examples i2c usb flash sms rfid python esp8266 servo books bldc remap eeprom bkp battery ethernet uart usart displays led websocket nodemcu wifi
Архіви