/_test_secrets_api

secrets saving via api and one-time access via key generation

Primary LanguagePython

Тестовое задание на вакансию backend разработчика

Задача:

Нужно сделать 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

docker-compose up -d

вручную

  1. Задать преемнные окружения, напрмиер через файл .env:
export REDIS_HOST=127.0.0.1
export REDIS_PORT=6379
export REDIS_DB=0
  1. Считать файл с перемеными окружения
source .env
  1. перейти в каталог с приложение и установить зависсимости
cd app
pip3 install -r requirements.txt
  1. запустить dev сервер через uvicorn
uvicorn app:app --host 127.0.0.1 --port 8000

Реализация

Эндпоинт /generate

При получении секрета и кодовой фразы, генерируется ключ, секрет кодируется при помощи кодовой фразы и сохраняется в базу данных редис с секретным ключем с указанным временем жизни (по-умолчанию 1 час).

Эндпоинт /secret/<ключ>

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

Зависимости

pip3 install fastapi redis cryptography uvicorn