Мультитенантное приложение 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, так что обратный прокси в обратном прокси/маршрутизаторе) независимо от того, что происходит, и эти запросы будут направлены к нужному "арендатору" Я знаю, что это безумие и расточительство.

Надеюсь, это имеет смысл.

Вернуться на верх