Мультитенантное приложение Docker с сервером аутентификации и API
Здравствуйте, я работаю над веб-проектом, и мой текущий стек выглядит следующим образом. У меня есть nginx для http-сервера, nextjs для фронтенда и django в качестве бэкенда. Простые вещи. Где вы можете зарегистрировать компанию и каждая компания может иметь несколько пользователей.
По мере роста проекта я захотел вместо того, чтобы иметь что-то вроде бэкенда с кухонной раковиной, где есть одна БД и все пользователи и компании находятся в ней. Я хочу разделить их, но я также собираюсь докеризировать, так что каждый арендатор будет иметь приложение docker и docker postgres для этого приложения docker. Я также собираюсь создать еще одно приложение djano только для регистрации арендаторов, чтобы я мог вести учет.
Таким образом, он будет выглядеть следующим образом
--NGINX
--domain1.app
--domain1.db
--domain2.app
--domain2.db
--domain-registeration-app
--frontend-nextjs-app
domain-registeration-app
app book хранит всех арендаторов и форкает новые экземпляры docker для нового арендатора и, возможно, обрабатывает платежи для каждого арендатора.
Теперь возникает проблема. Это будет работать, если пользователь находится только в одном арендаторе и, скорее всего, запомнит поддомен для арендатора и сможет перейти к приложению этого арендатора, набрав tenant1.myapp.com в urk, а nginx направит этот запрос на соответствующий поддомен docker для обработки запросов.
Но в моем случае пользователь может быть членом нескольких арендаторов (и не думайте, что арендаторы - это компании вроде google, shell, netflix и т. д., где пользователь НЕ будет членом нескольких арендаторов, если только он не корпоративный шпион:) Думайте об арендаторах, как о спортзале или чем-то еще, где этот сценарий более правдоподобен.
Таким образом, пользователю придется запомнить все поддомены (что если он находится в 20 доменах) и места, где он должен войти в систему.
В идеале, когда вы входите в систему, вы должны получить все домены, в которых вы состоите (
).Но поскольку пользователи специфичны для домена (то есть каждое приложение имеет свою собственную таблицу пользователей для безопасности), вы не можете запросить все домены, если только не сделаете какой-нибудь сумасшедший многоадресный запрос ко всем приложениям и не посмотрите, какие из них ответят 200, и вы сможете перечислить домены, где пользователь существует).
Естественно, первое, что приходит в голову, это переместить таблицу пользователей в domain-registeration-app
, где создаются и обслуживаются арендаторы.
Но первое, что приходит в голову, - это сколько обычных вещей мне нужно переместить в domain-registeration-app
, прежде чем они превратятся в кухонную раковину. (но это легко решить)
Но самое главное, какой механизм аутентификации вы бы использовали.
Я думал, что при создании нового арендатора (назовем его tenant1) в domain-registeration-app
мы можем создать секретный ключ для этого tenant1
, который хранится в .tenant1.local.env
, и оба domain-registeration-app
и tenant1.app
, которые только что были созданы, могут использовать один и тот же секрет. domain-registeration-app
создает новый JWT, который также может быть использован tenant1.app
. Таким образом, когда domain-registeration-app
передает jwt во фронтенд, пользователь может отправлять данные непосредственно tenant1.app
, используя тот же jwt, созданный domain-registeration-app
Важно отметить, что каждый арендатор будет иметь свой собственный секрет в .tenat*.env.local
Безопасно ли это. Я даже думал о том, чтобы направлять все запросы на domain-registeration-app
, поскольку пользователи там находятся в качестве точки входа (что-то вроде обратного прокси, как nginx, так что обратный прокси в обратном прокси/маршрутизаторе) независимо от того, что происходит, и эти запросы будут направлены к нужному "арендатору" Я знаю, что это безумие и расточительство.
Надеюсь, это имеет смысл.