Веб-токены JSON просты в использовании и отладке, но они также обеспечивают впечатляющее повышение безопасности.

Нарушенная аутентификация по-прежнему является постоянной уязвимостью в современных веб-приложениях — она по-прежнему занимает одно из первых мест в десятке основных угроз безопасности API по версии OWASP.

Последствия этой уязвимости могут быть серьезными. Они могут предоставить несанкционированный доступ к конфиденциальным данным и поставить под угрозу целостность системы. Для эффективного обеспечения безопасного доступа к приложениям и их ресурсам крайне важно использовать надежные механизмы аутентификации.

Узнайте, как реализовать аутентификацию пользователей во Flask с помощью веб-токенов JSON (JWT) — популярного и эффективного метода на основе токенов.

Аутентификация на основе токенов с использованием веб-токенов JSON

Аутентификация на основе токенов использует зашифрованную строку символов для проверки и авторизации доступа к системе или ресурсу. Вы можете реализовать этот тип аутентификации, используя различные методы, включая токены сеанса, ключи API и веб-токены JSON.

instagram viewer

В частности, 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 для выполнения операций, связанных с пользователем.

  1. сохранять Метод сохраняет новый пользовательский документ с указанным именем пользователя и паролем в коллекции MongoDB и возвращает идентификатор вставленного документа.
  2. найти_по_идентификатору и найти_по_имени_пользователя методы извлекают пользовательские документы из коллекции на основе предоставленного идентификатора пользователя или имени пользователя соответственно.

Определите маршруты аутентификации

  1. Начнем с определения маршрута регистрации. Этот маршрут добавит новые пользовательские данные в коллекцию пользователей 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 пользователя})

  2. Реализуйте функцию входа в систему, чтобы обрабатывать процесс аутентификации и проверять учетные данные пользователя. Под маршрутом регистрации добавьте следующий код.
     @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({'сообщение': 'Неправильное имя пользователя или пароль'})

    Конечная точка входа делает две вещи: проверяет предоставленные учетные данные пользователя и после успешной аутентификации создает уникальный JWT для этого пользователя. Он устанавливает этот токен в качестве файла cookie в ответе вместе с полезными данными JSON, указывающими на успешный вход в систему. Если учетные данные недействительны, он вернет ответ JSON, указывающий на это.
  3. Определите функцию декоратора, которая проверяет веб-маркеры JSON (JWT), передаваемые вместе с последующими запросами API. Добавьте приведенный ниже код в поле register_routes блок функционального кода.
    деф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)

    возвращаться украшен

    Эта функция декоратора обеспечивает наличие действительного токена JWT в последующих запросах API. Он проверяет, отсутствует ли токен, истек ли срок его действия или он действителен, и возвращает соответствующий ответ JSON, если это так.
  4. Наконец, создайте защищенный маршрут.
     @app.route('/api/users', методы=['GET'])
    @токен_требуется
    дефget_users(текущий пользователь):
    пользователи = список (коллекция. найти ({}, {'_идентификатор': 0}))
    возвращаться jsonify (пользователи)

Эта конечная точка обрабатывает логику извлечения пользовательских данных из базы данных, но требует, чтобы клиент, отправляющий запросы, включал действительный токен для доступа к данным.

Наконец, запустите приведенную ниже команду, чтобы запустить сервер разработки.

прогон фляги

Чтобы проверить регистрацию, вход в систему и конечную точку защищенных пользователей, вы можете использовать Postman или любой другой клиент API. Отправляйте запросы на http://localhost: 5000/api/и наблюдайте за ответами, чтобы проверить функциональность этих конечных точек API.

Является ли аутентификация по токену надежной мерой безопасности?

Веб-токены JSON обеспечивают надежный и эффективный способ аутентификации пользователей для вашего веб-приложения. Однако важно понимать, что аутентификация с помощью токена не является надежной; это только одна часть большой головоломки безопасности.

Объедините аутентификацию с помощью токенов с другими передовыми методами обеспечения безопасности. Не забывайте о постоянном мониторинге и применяйте последовательные методы обеспечения безопасности; вы значительно повысите общую безопасность своих приложений Flask.