Навигация по курсу:
JWT-аутентификация в FastAPI
Мы собираемся аутентифицировать наших пользователей с помощью веб-токенов JSON. При первом подходе API мы в основном видим аутентификацию на основе jwt. Проще говоря, мы один раз передаем адрес электронной почты и пароль API, и API отвечает длинной строкой/токеном, который мы предоставляем для входа в систему. Как и все остальное, у этого есть свои плюсы и минусы. Одним из основных преимуществ является то, что даже если токен украден, учетная запись нашего пользователя не будет скомпрометирована навсегда, поскольку эти токены обычно действительны в течение нескольких часов/дней в зависимости от параметра, называемого сроком действия.
В этом посте мы научимся создавать токен доступа, учитывая адрес электронной почты или имя пользователя. Нам нужно создать новый файл внутри основной папки core > security.py и поместите сюда следующий код
- Мы получим словарь данных. В идеале этот дополнительный адрес представляет собой адрес электронной почты/имя пользователя, который может однозначно идентифицировать каждую запись в таблице.
- данные могут выглядеть так: {"sub":"ping@zahodivit.com"}
- Срок действия этих токенов доступа автоматически истекает через 30 минут.
- Мы используем секретный ключ и алгоритмы для кодирования этого словаря данных, чтобы получить токен доступа.
Для создания токена доступа нам также понадобится secret_key и имя используемого алгоритма. Итак, давайте добавим их в наш файл core > config.py
Поскольку мы получаем секретный ключ из переменной среды, нам нужно создать эту переменную среды или мы также можем добавить секретный ключ в наш файл .env. Я создам дополнительный файл .env.template, чтобы напомнить, что вам нужен файл .env (мы его создавали ранее, если у вас его нет - создайте)
Мы используем python-jose для создания токенов доступа, мы также можем использовать библиотеку python-jwt, но python-jose обновлен и представляет собой своего рода расширенный набор python-jwt. Итак, давайте остановимся только на python-jose. Давайте добавим эту зависимость в файл requirements.txt и выполним установку
Все готово, пришло время проверить, работает это или нет. Давайте проверим это в терминале.
Создание системы для аутентификации пользователей
Аутентификация означает идентификацию пользователя. Они должны быть теми, кем они себя называют. Проще говоря, это относится к функции входа в систему в нашем приложении. Выше мы реализовали логику создания токенов JWT. Наша логика аутентификации будет опираться на токены JWT. По сути, пользователи нашего веб-приложения отправят свой адрес электронной почты и пароль, мы проверим учетные данные и отправим им токен JWT. Добавим эти функции в файл apis > v1 > route_login.py
Примечание
Мы будем работать только с электронной почтой, но наша форма Outh2PasswordRequestForm обязательно будет иметь поле с именем «имя пользователя». Никаких проблем, мы разрешим нашим пользователям вводить свой адрес электронной почты и запрашивать базу данных, используя только электронную почту! Поле «имя пользователя» не ограничивает нас в вводе имени пользователя😁! Нам нужна схема, чтобы убедиться, что мы возвращаем access_token и token_type, как определено в нашей модели ответа. Давайте поместим этот код в schemas > token.py
Нам также нужна функция, которая будет возвращать пользователя по адресу электронной почты. Давайте создадим эту функцию в db > repository > login.py. Опять же, мы делаем это, потому что хотим сохранить логику базы данных или нашу бизнес-логику отдельно. Это пример разделения ответственности.
Почти готово, теперь нам нужно сообщить нашему приложению FastAPI, что эта функциональность есть. Для этого нам нужно поместить эти две строки в apis > base.py
И последнее: поскольку мы работаем с данными формы, а не с простым JSON, нам нужна многокомпонентная библиотека Python для обработки извлечения данных формы. Итак, давайте добавим это в файл requirements.txt и выполним установку
pip -r requirements.txt
Пришло время протестировать нашу реализацию: на этот раз я использую Postman, вы также можете протестировать с свагером FastAPI (http://127.0.0.1:5000/docs). Результаты будут такими же.
Авторизация в FastAPI
Авторизация и аутентификация — это две разные темы. Аутентификация связана с входом в систему, а авторизация связана с разрешением. Даже если человек вошел в систему, у него может не быть необходимых разрешений. Предположим, в нашем блоге есть администраторы и пользователи. Теперь любой, кто знает наши конечные точки, может сделать запрос на размещение и изменить наше сообщение! Еще хуже, если какой-нибудь маньяк отправит запрос на удаление каждого поста в нашем блоге! 😭
Итак, нам нужно проверить, имеет ли лицо, делающее запрос, необходимые разрешения. В нашем случае мы хотим, чтобы только авторы или суперпользователь могли изменять или удалять публикацию. Хватит разговоров, давайте посмотрим код. До этого вы помните зависимости? Мы создали зависимость get_db, которая позволяет нам предоставлять соединение с базой данных для каждого запроса. На этот раз мы также собираемся создать зависимость для идентификации текущего пользователя. Нам понадобится приведенный ниже код в apis > v1 > route_login.py
- Мы декодируем токен, если он присутствует, и проверяем пользователя. Если у нас есть пользователь, мы просто возвращаем его. Таким образом мы получаем доступ к текущему пользователю.
- Это мы можем использовать как зависимость для идентификации текущего пользователя.
- Мы также можем сравнить имя автора текущего пользователя с идентификатором автора, который пытается удалить блог, и разрешить или запретить его.
Давайте интегрируем разрешения с нашим представлением публикации, чтобы прикрепить реальный идентификатор пользователя вместо захардкоженного идентификатора пользователя. И мы также собираемся связать эту зависимость с нашим маршрутом удаления, чтобы только пользователи, создавшие сообщение или являющиеся суперпользователями, могли удалить сообщение в блоге.
Теперь осталось только написать некоторый код в db > repository >blog.py, чтобы принимать решения на основе текущего пользователя
Все готово, давайте попробуем. 🙈
Ураа!!! Оно живое)
Фуух! Долгий был путь. Мы прошли много тем. Предлагаю на этом завершить наш мини-курс по основам FastAPI и основным стэком технологий.
Если вы пропустили какой-то из уроков, советую вам обязательно прочитать!
Спасибо вам за терпение) Надеюсь этот курс был для вас полезным
.
❤️ Если вам понравилась статья, ставьте лайк и подписывайтесь на мой канал (Заходи в Ай-Ти).
👍 Если у вас остались вопросы или есть интересные темы, которые вы хотите, чтобы я разобрал, то пишите в комментариях. Ваше мнение очень важно для меня!
#fastapi #fastapi python #python jwt #jwt токен #fastapi авторизация #fastapi аутентификация