1 Setup a Password Hash
The solution is to use a Password Hash. Let us see what a hash is, so go to the python shell in the terminal and run the command
We will get a long random string as shown below:
Hence even if the hacker gets access to them, he won’t be able to decrypt. Also, we have another function to compare the Hash with a password, called check_password_hash.
It works as below:
Now hit enter, it will return True if matched and False if unmatched.
2 Adding Hashed Passwords to Your Database
Also if you don’t have FlaskSQLAlchemy, simply install it using the pip command:
Okay, now that SQLAlchemy is in place, create a file models.py and add the code:
Here:
3. Setting the Flask_login Extension
Also, we need to create and initialize the Flask_login extension. We do it using the code:
4. Complete Code
That’s it with the models.py part. Let us just look at the whole code once:
Do check out our SQLAlchemy Article if you are unfamiliar with Flask SQLAlchemy.
Coding our main Flask application file
Now let’s code our main Flask Application File.
1 Linking Database to our Flask File
Okay now we need to link our SQLite database with SQLALchemy. So for that add the code:
Just replace <db_name> with whatever name you want. Also, we need to link our SQLAlchemy DB instance (present in models.py file) with the main app. For that, add:
3 Coding a Simple View
Hence add a simple view:
Note how we have used the @login_required decorator. The blog.html template would be:
Do checkout our Flask Templates article to know more about Templates.
3 Coding the Log-in View
The Login view would be simple. It should do the following:
So add the code:
And the login.html template:
4 Coding the Register View
The Register View should be able to do the following:
So the code will be:
Therefore the register.html page will be:
Статья – авторизация и аутентификация web-приложений (for example python flask)
План :
Запланировал разобрать аутентификацию и авторизацию веб-приложений на примере
Flask
. Это первая часть из моей серии, т.к информации достаточно много и я стараюсь правильно ее распределить. Я сам если честно не люблю тонны скучных определений, поэтому постараюсь донести свои мысли более-менее интересно (не факт) Но все же теория – основа доказательства (только что придумал) и блин, я не понимаю откуда мое непреодолимое желание ставить скобки )) (ам сори)
Итак, если кратко, то в этой части хочу разобрать что вообще такое Фласк (если кто не знаком), для чего используются печеньки и сессии в веб-приложениях, запустить свое приложение для тестов и примеров.
Ну ок че ? Погнали)
О Flask
:
Flask
— микро-фреймворк для создания
WSGI
(Web Server Gateway Interface) приложений на языке Python. Точнее сказать можно, но думаю не нужно. Собственно, что означает микро и основная документация расположена
здесь
, пока же мы запустим минимальное приложение для старта :
Вот так просто вы можете поднять свой веб-сервер на localhost:5000. Если вы хотите поднять сервер на конкретном адресе, изменить порт или использовать отладку ( желательно ), вам следует переопределить метод запуска как :
Маршруты :
Маршруты URL создаются с помощью декоратора
@app.route.
Функция
render_template
возвращает html шаблон. Все шаблоны html должны находится в каталоге
templates
внутри приложения. В каталоге
static
находятся подкаталоги
css img js
Я не использовал всю мощь шаблонов
jinja2
в полной мере, а просто нарисовал html примерно вот так :
Таким образом структура приложения внутри папки
project
:
Авторизация :
Авторизация – это механизм предоставляющий пользователю (после аутентификации) доступ к тем или иным ресурсам. В своем приложении я буду использовать расширения
Flask-Login
для авторизации пользователя. Авторизация происходит с помощью функции
login_user()
но Flask-Login ожидает от нас модель пользователя, которую нам необходимо создать, и чтобы не прописывать методы вручную можно наследоваться от UserMixin в
db_models.py
login_user(user)
вызывается в после проверки логина и пароля в форме, создает объект пользователя и заносит данные о нем в сессию.
С помощью декоратора
@login_manager.user_loader
при каждом запросе клиента будет загружаться информация о пользователе.
Декоратора
@login_required
ограничивает доступ к маршруту не авторизованных пользователей.
Главная страница возвращает заглушку.
Cookie и сессии :
Файлы куки
– это небольшие фрагменты данных, которые хранятся на вашем компьютере веб-браузером, и их первоначальная цель – запоминать информацию о состоянии при просмотре различных веб-сайтов (страниц).
Сессии
также используются для хранения данных пользователя, но в отличие от печенек (которые полностью хранятся на стороне клиента) при сессиях в куках может хранится только идентификатор сессии. Другими словами сессии – это частный случай cookies, сервер кодирует данные и передает получившееся значение клиенту, клиент при следующих запросах передает эти данные обратно в заголовке
Set-Cookies :
после чего сервер проводит их декодирование и валидацию. При конфигурации приложения во Flask указывается секретный ключ, по которому приложение проверяет криптографически, были ли изменены данные сессии. Это так называемые – клиентские сессии. Фласк использует по умолчанию именно их.
Существуют серверные сессии, которые хранятся на стороне сервера, а в запросе клиента передается идентификатор, по которому сессия может быть валидирована и получена из БД.
Я добавил серверные сессии с помощью
flask_sessionstore.
СУБД :
Чтобы работать с БД существует модуль
flask_sqlalchemy
. В данный момент я использую
MySQL
. Конфигурация приложения
flask_sessionstore
и
flask_sqlalchemy
находится в
__init__.py
:
В
__init__
импортируются все модули из пакета а
start.py
находится каталогом выше в
Project
и содержит
from project_x import app
Таким образом происходит запуск приложения.
Серверные сессии :
При создании приложения создаются модели БД.
При первом запросе происходит редирект на /auth и устанавливаются куки сессии :
Отправляем данные из формы для авторизации (предварительно конечно есть форма регистрации) и получаем токен :
В клиентской куки передается только ай ди сессии. Для токена устанавливается значение
fresh=True
, если данные в куки или БД побьются, свежесть=
false
.
Чекнем :
Извиняюсь за поехавшие таблицы.
Мы также можем обратиться к объекту сессии, чтобы провести проверку дополнительно. Если убить сессию из БД Flask все равно считает пользователя авторизованным (не знаю почему, видимо я что то упустил) поэтому проверю свежий ли токен :
Я использовал простой метод авторизации и во Flask есть возможность это улучшить используя WTForms. В частности достаточно просто реализуется защита от
CSRF
атак.
Далее планирую реализовать формы и
JSON WEB TOKEN
(без запросов к БД) авторизацию, рассмотреть другие протоколы.
Спасибо за внимание !