Нужно сделать HTTP сервис для одноразовых секретов наподобие https://onetimesecret.com/.
Он должен позволить создать секрет, задать кодовую фразу для его открытия и сгенерировать код, по которому можно прочитать секрет только один раз. UI не нужен, это должен быть JSON Api сервис.
Для написания сервиса можно использовать FastAPI или любой другой фреймворк. • Метод /generate должен принимать секрет и кодовую фразу и отдавать secret_key по которому этот секрет можно получить. • Метод /secrets/{secret_key} принимает на вход кодовую фразу и отдает секрет.
• Язык программирования: Python 3.7.
• Использование Docker, сервис должен запускаться с помощью docker-compose up.
• Код должен быть реализован на Фреймворке FastAPI .
• Код должен соответствовать PEP, необходимо использование type hints, к публичным методам должна быть написана документация на английском языке.
• Написаны тесты (постарайтесь достичь покрытия в 70% и больше). Вы можете использовать pytest или любую другую библиотеку для тестирования.
• Сервис асинхронно обрабатывает запросы.
• Данные сервиса хранятся во внешнем хранилище, запуск которого также описан в docker-compose. Мы рекомендуем использовать Postgres, но Вы можете использовать любую подходящую базу.
• Секреты и кодовые фразы не хранятся в базе в открытом виде.
• Добавлена возможность задавать время жизни для секретов. Можно попробовать реализовать это с помощью TTL индексов.
docker-compose up -d
- Задать преемнные окружения, напрмиер через файл
.env
:
export REDIS_HOST=127.0.0.1
export REDIS_PORT=6379
export REDIS_DB=0
- Считать файл с перемеными окружения
source .env
- перейти в каталог с приложение и установить зависсимости
cd app
pip3 install -r requirements.txt
- запустить dev сервер через uvicorn
uvicorn app:app --host 127.0.0.1 --port 8000
- апи сервиса доступно по адресу http://localhost:8000/
- документация по апи доступна по адресу http://localhost:8000/docs
При получении секрета и кодовой фразы, генерируется ключ, секрет кодируется при помощи кодовой фразы и сохраняется в базу данных редис с секретным ключем с указанным временем жизни (по-умолчанию 1 час).
При получении ключа и кодовой фразы, секрет извлекается из базы данных по ключу и декодируется при помощи кодовой фразы. Если кодовая фраза неверная или секрета нет в базе данных, то пользователю выводится сообщение о том, что секрета нет. После извлечения секрета, он удаляется из базы данных и декодированный секрет отправляется пользователю.
pip3 install fastapi redis cryptography uvicorn