OAuth2 где хранить идентификатор и секрет клиента при создании приложения на старте сервера
Я использую django-oauth-toolkit для авторизации моего Django-приложения, а для разработки каждый разработчик развертывает свой сервер на Kubernetes с базой данных MySQL, также развернутой на стороне в виде StatefulSet. Много раз мне (или другим разработчикам приложения) приходилось удалять их базу данных и переустанавливать их развертывание в k8s. Обычно (при развертывании без k8s и в соответствии с инструкцией по быстрому запуску) вы развертываете свое приложение, регистрируете новое клиентское приложение через UI, предоставляемый django-oauth-toolkit, и затем получаете однократно сгенерированный клиентский секрет, который нужно немедленно скопировать, иначе он исчезнет и вам придется заново создавать клиента. Но это неудобно, так как при каждой новой установке нам приходится продолжать делать это и обновлять client_secret в приложениях, использующих сервер авторизации, новым значением.
Итак, я нашел способ авторегистрации клиентского приложения OAuth2 следующим образом при пост-миграции (это фрагмент, что-то вроде этого)
from oauth2_provider.models import Application
@receiver(post_migrate)
def initialize_client_applications():
Application.objects.create(
client_type="confidential",
authorization_grant_type="password",
name="client_name",
client_id='myComplexClientIdString",
client_secret='myComplexClientSecretString",
user=User.objects.get(name="someuser")
)
Но, как вы можете видеть, client_secret жестко закодирован и поэтому довольно небезопасен. Как я могу сделать это, используя код при запуске, но сохраняя client_secret где-нибудь более безопасным способом?
Я видел этот ответ https://stackoverflow.com/a/70189221/15072862 и подумал, что могу просто создать случайную строку для этого client_secret (например, используя функцию make_password() в Django), а разработчики могут ssh-сервер и получить доступ к этому значению через (все еще неудобно, но, по крайней мере, мы можем сделать shell-скрипт. используя функцию make_password() в Django), и разработчики смогут зайти на сервер и получить доступ к этому значению через python manage.py shell
(все еще неудобно, но, по крайней мере, мы можем сделать shell-скрипт для этого), но база данных на самом деле хэширует все, что я ввожу, поэтому доступ к этой переменной не поможет.