Начну, пожалуй, с самого главного - с регистрации и аутентификации.
Регистрация
Логика регистрации проста:
- Получаем данные от пользователя
- Ищем пользователя в БД. Если находим, то выдаем ответ “такой пользователь уже существует”
- Хэшируем пароль
- Записываем нового пользователя в БД
- Генерим JWT-токены и отправляем в ответ
Однако, так как в качестве фронта будет телеграмм-бот, мы же не будем просить пользователя ввести пароль? В качестве решения будет следующая схема: пользователь входит в чаи с ботом и нажимает кнопку старт. Фронт отправляет ID-пользователя как username
и связку <некоторая строка + ID-пользователя> как пароль. Сервер примет пароль, добавить соль и захеширует его. В итоге регистрация не будет зависить от используемого фронта, что очень хорошо.
Теперь пройдемся немного по стеку. В качестве БД использую Mongo
. Чтобы не писать запросы ручками через Motor
, использую odmantic
- ODM, который использует pydantic
. Можно использовать umongo
, но у меня возникла проблема - не удалось завести запуск
import asyncio
asyncio.run(User.ensure_indexes())
чтобы построить индексы отдельно. Всё время ругался, что запускаю Future in different loop. Промучившись некоторое время, нашел odmantic
, который полностью меня устроил.
Аутентификация
С аутентификацией всё просто: ищем пользователя, сравниваем пароль. Если не нашли пользователя с таким username
или проверка пароля не прошла, то говорим, что “пользователь или пароль не верны”. Иначе генерим JWT-токены и отправляем их пользователю. В документации по FastAPI
есть прекрасная глава с описанием, как это сделать.
Вместо заключения
А теперь можно выкинуть всё, что писал выше. Пока писал, понял, что подхожу с точки зрения наличия отдельных пользователей, которые регистрируются через фронт. Возможно, в дальнейшем это и будет. Но с ботом в телеграмме другая ситуация: пользователи уже зарегистрированы в телеграмме, а мне надо только подтверждать, что запросы идут от моего бота. Поэтому схема должна быть другая: в боте хранится некий токен, который будет отправлятся с каждым запросом. На входе в бэк мы смотрим, что запрос приходит с верным токеном и обрабатываем его. Иначе просто отклоняем запрос.