Как аутентифицироваться и авторизоваться в микросервисной архитектуре

Короткий: Как аутентифицировать и авторизовать пользователей на основе ролей в микросервисной архитектуре?

Длинный: Скажите, что у вас есть архитектура, представленная ниже. Я изо всех сил пытаюсь понять, что было бы лучшим практическим решением для защиты такой архитектуры. Когда я ищу, я получаю много разных ответов.

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

"Использовать JWT". Если я прав, то использование токена JWT не подходит для внешнего использования (например, в SPA).

«Использовать комбинацию непрозрачных токенов извне и JWT, внутренне связанного в redis / memchache». Это кажется лучшим решением для моей ситуации, но моя проблема здесь в отсутствии реальных ссылок на библиотеки / примеры кода.

Я был бы очень признателен, если бы у кого-то были ссылки на фактические реализации того, что я пытаюсь выполнить, а именно: Аутентификация, авторизация на основе ролей, в микросервисной архитектуре.

Как аутентифицироваться и авторизоваться в микросервисной архитектуре

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
1 007
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Следуйте протоколу OAuth, так как он дает вам довольно много возможностей: вы можете начать с собственного IDM / IAM, а затем сможете подключаться через социальные платформы.

Мы начали с JWT, и по большей части это был просто подписанный токен (через некоторое время мы перешли на подписанные и зашифрованные токены). Мы создали одну службу, отвечающую за обработку аутентификации и создание токена JWT. (Мы начали с Keycloak, но позже перешли на собственный сервис, так как keycloak был слишком громоздким для нашего варианта использования)

Когда вы говорите внешний, я не уверен, что вы имеете в виду, если он доступен конечному пользователю IMO, мы можем жить только с подписанным токеном. Да, вся информация видна пользователю, но это вся его информация и некоторая информация, относящаяся к авторизации.

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

Использование комбинации непрозрачного токена и JWT может быть излишним, если только у вас нет очень веских причин против этого. ИМО, вы сохраняете простоту для начала, используйте JWT, если требуется, зашифруйте его. Все, что вам нужно, это еще одна служба для управления аутентификацией, создания и подписания токена, и у вас все должно быть хорошо.

Большое спасибо за хороший ответ, Анунай. Я пока буду использовать простой JWT, чтобы посмотреть, использует ли он все, что мне нужно. Чтобы следить за вашим ответом. Какая дополнительная информация потребуется? Под внешним провайдером я подразумеваю такие услуги, как www.Auth0.com.

OhLongJohnJohnson 16.09.2018 13:58

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

Anunay 16.09.2018 14:14

Ответственность за это решение будет возложена на общедоступный SPA, предоставляемый через nginx. Посредством этого SPA обычные пользователи и пользователи с «более высокими привилегиями» могут получать доступ к различным ресурсам и писать на них в зависимости от их роли. То, что я действительно ищу, - это передовой пример того, как выполнить простую аутентификацию и авторизацию по имени пользователя и паролю в среде микросервисов без необходимости полагаться на такие сервисы, как Auth0, провайдеры Google / Facebook Oauth2.

OhLongJohnJohnson 16.09.2018 14:25

Вы можете использовать решение, размещенное в помещении, например, keycloak. Но если вы хотите написать свой собственный, из того, что я использовал, я могу предложить pac4j или shiro. Они находятся в java, но могут помочь вам понять основы. Если вам что-то нужно в узле, я, возможно, не смогу вам больше помочь, кроме как предложить вам использовать jwt libs для генерации и подписи токена и какое-то сильное решение для хеширования с солями и управление роли в простой базе данных.

Anunay 16.09.2018 14:50

Я попробую Keycloak. В противном случае я буду генерировать JWT для пользователей и хранить их информацию (имя пользователя, зашифрованный пароль и роль) в базе данных, а затем передавать jwt, содержащий их роль, что я могу проверить с помощью своих служб.

OhLongJohnJohnson 16.09.2018 15:00

Другие вопросы по теме