Обмен данными в микросервисной архитектуре

Рейтинг: 0Ответов: 0Опубликовано: 16.01.2023

Разрабатываю стриминговое аудио приложение. Хочу реализовать серверную часть, основанную на микросервисах, также нужна авторизация

Необходимо сделать следующие сервисы:

  • Identity - выдает JWT токены (access и refresh) по логину и паролю, обновляет их по refresh токену, удаляет refresh токен. БД у него не должно быть, он просто должен иметь возможность взаимодействовать с информационными сервисами, запрашивать и менять в них данные, после возвращать клиенту сгенерированные токены
  • Information - группа сервисов с типом доступа Authorize:
    1. Users - выдает информацию о пользователях (пользовательские данные вроде id, логинов, сохраненных треков, плейлистов, настроек и прочего)
    2. Security - тут по идее должны храниться пользовательские пароли (хэш и соль), а также refresh токены. id - hashed - salt (пароли) и deviceHash - userId - refreshToken (токены)
    3. Tracks - выдает инфо о треках
    4. Прочие информационные сервисы
  • Gateway - шлюз, через который обращаются клиентские приложения (web, desktop, mobile), выполняет перенаправление на нужные сервисы, проверяет права доступа и прочее

Теперь вопрос. Так как у меня имеется шлюз, то через него происходит весь обмен информацией между клиентами и другими сервисами. Также у сервисов должна быть возможность обратиться к другому сервису.

Авторизация происходит по jwt токену, тут достаточно просто - добавляем заголовок Authentication: Bearer AccessToken. Но тут возникает проблема, как именно сервисы должны взаимодействовать. Пользователь вводит логин и пароль, они отправляются по HTTPS на Gateway, после он перенаправляет их на Identity, он не защищен, так что запрос можно легко отправить, там происходит валидация полученных данных.

Ему теперь нужны пользовательские данные - userId, login, hashedPassword, Salt чтобы выполнить проверку введенных данных.
Нужно выполнить запрос на Information.Security сервис, откуда получить данные для проверки, но там стоит Authorize по Jwt токену, как сервису пройти на информационный сервис, если у него нет токена. Отправлять запрос в обход gateway тоже не пойдет, так как на сервисе тоже установлен Authorize, мало ли кто-то получит адрес сервиса и попробует запросить данные

Gateway работает на базе Ocelot. Использую Asp Net Core, не совсем понимаю как это должно работать, для клиента все достаточно просто, ввел логин и пароль, получил access (как с refresh - уже вопросы, конечно), но как между сервисами прокидывать запросы - абсолютно непонятно

Есть еще подход, когда gateway просто выполняет перенаправление, а сама аутентификация происходит на сервисах, но тут та же проблема. Через шлюз запрос пройдет, но потом будет отклонен, так как сервис защищенный, и для доступа нужно выполнить авторизацию по токену

Мне нужно каждому сервису также запрашивать свой jwt токен, по которому через gateway выполнять запросы? В jwt записать роли, по ним можно будет понять есть ли у сервиса доступ к данной операции или нет. А как тогда запросить токен для сервиса если для создания токена нужен доступ к информационному сервису. Или на Identity хранить коды для сервисов, и те смогут запросить токен по этому коду. Может я что то не так понимаю? Мне кажется это каким-то неправильным подходом

Ответы

Ответов пока нет.