Веб-токены JSON просты в использовании и отладке, но они также обеспечивают впечатляющее повышение безопасности.
Нарушенная аутентификация по-прежнему является постоянной уязвимостью в современных веб-приложениях — она по-прежнему занимает одно из первых мест в десятке основных угроз безопасности API по версии OWASP.
Последствия этой уязвимости могут быть серьезными. Они могут предоставить несанкционированный доступ к конфиденциальным данным и поставить под угрозу целостность системы. Для эффективного обеспечения безопасного доступа к приложениям и их ресурсам крайне важно использовать надежные механизмы аутентификации.
Узнайте, как реализовать аутентификацию пользователей во Flask с помощью веб-токенов JSON (JWT) — популярного и эффективного метода на основе токенов.
Аутентификация на основе токенов с использованием веб-токенов JSON
Аутентификация на основе токенов использует зашифрованную строку символов для проверки и авторизации доступа к системе или ресурсу. Вы можете реализовать этот тип аутентификации, используя различные методы, включая токены сеанса, ключи API и веб-токены JSON.
В частности, JWT предлагают безопасный и компактный подход к передаче необходимых учетных данных пользователей между клиентскими приложениями и серверами.
JWT состоит из трех основных компонентов: заголовка, полезной нагрузки и подписи. Заголовок содержит метаданные о токене, включая алгоритм хеширования, используемый для кодирования токена.
Полезная нагрузка содержит фактические учетные данные пользователя, такие как идентификатор пользователя и разрешения. Наконец, подпись обеспечивает действительность токена, проверяя его содержимое с помощью секретного ключа.
Используя JWT, вы можете аутентифицировать пользователей и хранить данные сеанса внутри самого токена.
Настройте проект Flask и базу данных MongoDB
Для начала создайте новый каталог проекта с помощью терминала:
mkdir фляжный проект
cd flask-проект
Далее установите виртуальная среда, чтобы создать локальную виртуальную среду разработки для вашего проекта Flask.
виртуальный
Наконец, активируйте виртуальную среду.
# Unix или MacOS:
источник venv/bin/активировать
# Окна:
.\venv\скрипты\активировать
Вы можете найти код этого проекта в этом Репозиторий GitHub.
Установите необходимые пакеты
В корневом каталоге папки вашего проекта создайте новый требования.txt файл и добавьте эти зависимости для проекта:
колба
pyjwt
python-dotenv
пимонго
bcrypt
Наконец, выполните приведенную ниже команду, чтобы установить пакеты. Убедитесь, что у вас есть точка (менеджер пакетов) установлен; если не, установите его на свою систему Windows, Mac или Linux.
pip install -r требования.txt
Создайте базу данных MongoDB
Идите вперед и создайте базу данных MongoDB. Ты можешь настроить локальную базу данных MongoDB, альтернативно, создать кластер на MongoDB Atlas, облачном сервисе MongoDB.
После создания базы данных скопируйте URI подключения, создайте .env файл в корневом каталоге вашего проекта и добавьте его следующим образом:
МОНГО_URI=""
Наконец, настройте подключение к базе данных из вашего приложения Flask. Создать новый утилиты/db.py файл в корневом каталоге вашего проекта с помощью этого кода:
от пимонго Импортировать MongoClient
дефconnect_to_mongodb(mongo_uri):
клиент = MongoClient (mongo_uri)
БД = client.get_database ("пользователи")
возвращаться дБ
Эта функция устанавливает соединение с базой данных MongoDB, используя предоставленный URI соединения. Затем он создает новый пользователи коллекция, если она не существует, и возвращает соответствующий экземпляр базы данных.
Создайте веб-сервер Flask
Настроив базу данных, продолжайте и создайте app.py файл в корневом каталоге папки проекта и добавьте следующий код для создания экземпляра приложения Flask.
от колба Импортировать Колба
от маршруты.user_auth Импортировать register_routes
от utils.db Импортировать connect_to_mongodb
Импортировать Операционные системы
от дотенв Импортировать load_dotenvприложение = Фляга (__имя__)
load_dotenv()mongo_uri = os.getenv('МОНГО_URI')
БД = connect_to_mongodb (mongo_uri)register_routes (приложение, БД)
если __имя__ == '__основной__':
app.run (отладка =Истинный)
Создайте конечные точки API аутентификации
Чтобы реализовать аутентификацию пользователей в вашем приложении Flask, очень важно определить необходимые конечные точки API, которые обрабатывают операции, связанные с аутентификацией.
Однако сначала определите модель для данных пользователей. Для этого создайте новый модель/user_model.py файл в корневом каталоге и добавьте следующий код.
от pymongo.коллекция Импортировать Коллекция
от bson.objectid Импортировать идентификатор объектасортПользователь:
деф__в этом__(я, коллекция: Коллекция, имя пользователя: str, пароль: str):
self.коллекция = коллекция
self.username = имя пользователя
self.password = пароль
дефсохранять(себя):
user_data = {
'имя пользователя': имя пользователя,
'пароль': личный пароль
}
результат = self.collection.insert_one (user_data)
возвращаться ул (result.inserted_id)@статический метод
дефнайти_по_идентификатору(коллекция: Коллекция, user_id: str):
возвращаться коллекция.find_one({'_идентификатор': ObjectId (user_id)})
@статический метод
дефнайти_по_имени_пользователя(коллекция: Коллекция, имя пользователя: str):
возвращаться коллекция.find_one({'имя пользователя': имя пользователя})
Приведенный выше код указывает Пользователь класс, который служит моделью данных и определяет несколько методов взаимодействия с коллекцией MongoDB для выполнения операций, связанных с пользователем.
- сохранять Метод сохраняет новый пользовательский документ с указанным именем пользователя и паролем в коллекции MongoDB и возвращает идентификатор вставленного документа.
- найти_по_идентификатору и найти_по_имени_пользователя методы извлекают пользовательские документы из коллекции на основе предоставленного идентификатора пользователя или имени пользователя соответственно.
Определите маршруты аутентификации
- Начнем с определения маршрута регистрации. Этот маршрут добавит новые пользовательские данные в коллекцию пользователей MongoDB. В корневом каталоге создайте новый маршруты/user_auth.py файл и следующий код.
Импортировать jwt
от инструменты Импортировать обертывания
от колба Импортировать jsonify, запрос, make_response
от модели.user_model Импортировать Пользователь
Импортировать bcrypt
Импортировать Операционные системыдефregister_routes(приложение, дб):
коллекция = db.users
приложение.config['СЕКРЕТНЫЙ КЛЮЧ'] = os.urandom(24)@app.route('/api/register', методы=['POST'])
дефрегистр():
имя пользователя = запрос.json.get('имя пользователя')
пароль = запрос.json.get('пароль')
существующий_пользователь = User.find_by_username (коллекция, имя пользователя)
если Существующий пользователь:
возвращаться jsonify({'сообщение': 'Имя пользователя уже занято!'})
hashed_password = bcrypt.hashpw (пароль.encode('утф-8'), bcrypt.gensalt())
new_user = Пользователь (коллекция, имя пользователя, hashed_password.decode('утф-8'))
user_id = new_user.save()возвращаться jsonify({'сообщение': «Пользователь успешно зарегистрирован!», 'ID пользователя': ID пользователя})
- Реализуйте функцию входа в систему, чтобы обрабатывать процесс аутентификации и проверять учетные данные пользователя. Под маршрутом регистрации добавьте следующий код.
Конечная точка входа делает две вещи: проверяет предоставленные учетные данные пользователя и после успешной аутентификации создает уникальный JWT для этого пользователя. Он устанавливает этот токен в качестве файла cookie в ответе вместе с полезными данными JSON, указывающими на успешный вход в систему. Если учетные данные недействительны, он вернет ответ JSON, указывающий на это.@app.route('/api/логин', методы=['POST'])
дефавторизоваться():
имя пользователя = запрос.json.get('имя пользователя')
пароль = запрос.json.get('пароль')
user = User.find_by_username (коллекция, имя пользователя)
если пользователь:
если bcrypt.checkpw(пароль.кодировать('утф-8'), пользователь['пароль'].кодировать('утф-8')):
токен = jwt.encode({'ID пользователя': ул (пользователь['_идентификатор'])}, app.config['СЕКРЕТНЫЙ КЛЮЧ'], алгоритм="HS256")
ответ = make_response (jsonify({'сообщение': 'Авторизация успешна!'}))
ответ.set_cookie(жетон, жетон)
возвращаться ответвозвращаться jsonify({'сообщение': 'Неправильное имя пользователя или пароль'})
- Определите функцию декоратора, которая проверяет веб-маркеры JSON (JWT), передаваемые вместе с последующими запросами API. Добавьте приведенный ниже код в поле register_routes блок функционального кода.
Эта функция декоратора обеспечивает наличие действительного токена JWT в последующих запросах API. Он проверяет, отсутствует ли токен, истек ли срок его действия или он действителен, и возвращает соответствующий ответ JSON, если это так.дефtoken_required(е):
@обертывания (ж)
дефукрашен(*аргументы, **кваргс):
токен = запрос.cookies.get(жетон)еслинет токен:
возвращаться jsonify({'сообщение': «Жетон отсутствует!»}), 401пытаться:
data = jwt.decode (токен, app.config['СЕКРЕТНЫЙ КЛЮЧ'], алгоритмы=["HS256"])
current_user = User.find_by_id (коллекция, данные['ID пользователя'])
кроме jwt. ExpiredSignatureError:
возвращаться jsonify({'сообщение': «Срок действия токена истек!»}), 401
кроме jwt. Инвалидтокенеррор:
возвращаться jsonify({'сообщение': «Неверный токен!»}), 401возвращаться f (текущий_пользователь, *args, **kwargs)
возвращаться украшен
- Наконец, создайте защищенный маршрут.
@app.route('/api/users', методы=['GET'])
@токен_требуется
дефget_users(текущий пользователь):
пользователи = список (коллекция. найти ({}, {'_идентификатор': 0}))
возвращаться jsonify (пользователи)
Эта конечная точка обрабатывает логику извлечения пользовательских данных из базы данных, но требует, чтобы клиент, отправляющий запросы, включал действительный токен для доступа к данным.
Наконец, запустите приведенную ниже команду, чтобы запустить сервер разработки.
прогон фляги
Чтобы проверить регистрацию, вход в систему и конечную точку защищенных пользователей, вы можете использовать Postman или любой другой клиент API. Отправляйте запросы на http://localhost: 5000/api/и наблюдайте за ответами, чтобы проверить функциональность этих конечных точек API.
Является ли аутентификация по токену надежной мерой безопасности?
Веб-токены JSON обеспечивают надежный и эффективный способ аутентификации пользователей для вашего веб-приложения. Однако важно понимать, что аутентификация с помощью токена не является надежной; это только одна часть большой головоломки безопасности.
Объедините аутентификацию с помощью токенов с другими передовыми методами обеспечения безопасности. Не забывайте о постоянном мониторинге и применяйте последовательные методы обеспечения безопасности; вы значительно повысите общую безопасность своих приложений Flask.