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.py
python3 ./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. Завантаження файлів
Недавні записи
- Фільтрація Back-EMF. Безсенсорні BLDC мотори
- Text to speech. Українська мова
- LCD Display ST7567S (IIC)
- Розпізнавання мови (Speech recognition)
- Selenium
- Комп'ютерний зір (Computer Vision)
- Деякі думки про точність вимірювань в електроприводі
- Датчики Холла 120/60 градусів
- Модуль драйверів напівмосту IGBT транзисторів
- Драйвер IGBT транзисторів на A316J
Tags
eeprom encoder solar atmega flask pmsm websocket flash sms stm32 git ethernet soldering mpu-9250 dma bme280 adc nvic displays brushless wifi rs-232 bluetooth programmator ssd1306 ssd1331 gps sensors css meteo 3d-printer watchdog pwm gpio java-script mongodb bmp280 mpu-6050 usart battery piezo foc options dht11 nodemcu servo smd mpx4115a python docker capture max1674 raspberry-pi ngnix barometer remap rtc examples eb-500 hih-4000 esp8266 usb st-link timer i2c bkp dc-dc lcd motor web rfid led tim uart books avr exti bldc html
Архіви