PoC простого подхода управления секретами технических учётных записей. Они могут в частности использоваться для интеграции внешних систем.
- Секреты генерируются суперпользователем из админ-панели (не вводятся с клавиатуры!).
- Могут использоваться в качестве дополнительного фактора аутентификации технических учётных записей
(добавляем секрет в полезную нагрузку
JWT). Хранятся в виде хэшей (алгоритмSHA256). - В открытом виде они предоставляются суперпользователю один раз - при генерации через админ-панель. Повторно увидеть секрет в открытом виде не получится - только генерировать заново.
- Если секрет утёк или был утерян, просто перегенерируем его в админке по кнопке, передаём системе-интегратору по защищённому каналу связи.
В примере приложения у модели User есть поле type, определяющее тип учётной записи.
Для типа учётной записи User.Type.TECHNICAL, администратор системы может создать экземпляр сущности TechSecret.
secret_hash является read-only полем - его нельзя ввести с клавиатуры, оно генерируется
автоматически и псевдослучайно (исходный код в apps/users/services/secret.py).

Администратор системы видит готовый секрет в информационном сообщении об успещной генерации секрета.
В БД сохраняется хэш этого секрета (по умолчанию SHA256). То есть компрометация таблицы технических секретов БД не
позволит злоумышленнику получить секрет в открытом виде.
Если секрет утёк или был утерян, администратор системы перегенерирует его в админ-панели при помощи пользовательской кнопки "Сгененрировать секрет".
Связь между TechSecret и User - OneToOne, дабы не хранить кучу null-записей для пользователей, для которых
эти секреты не нужны. Это действительно верное решение, поскольку на 1'000'000 пользователей у нас может быть,
к примеру, всего порядка десятка технических УЗ.
python manage.py graph_models users -g -o assets/images/users_app_modelviz.png

