Используйте JWT для аутентификации отдельного микросервиса API

Я разрабатываю приложение с использованием микросервисов в NodeJS. Я создал API-интерфейс аутентификации, который обрабатывает обычный вход в систему и т. д., И он выдает JWT.

Как использовать их для защиты маршрутов в отдельном микросервисе API, написанном с помощью Express?

Нужно ли использовать JWT с секретом для расшифровки токена в приложении API?

Этот путь слишком сложен, а также противоречит принципу единой ответственности. Базовый обратный прокси решает проблему

veralex 14.03.2021 10:05
Стоит ли изучать 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 называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
5
1
10 403
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

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

Этот ответ упускает несколько вещей для простоты. Например, часто вам может понадобиться микрослужба авторизации, которая решает, что пользователю разрешено делать какие. Также может быть задействована реализация JWT. Вам может понадобиться уровень кеша для отслеживания JWT из белого и/или черного списка.

Не вызовет ли это узкое место в одном шлюзе API?

Shankar Regmi 22.05.2021 12:50

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

Ваш сервер аутентификации должен быть единственным эмитентом JWT для ваших микросервисов. Итак, когда пользователь входит в систему и успешно аутентифицируется, ваш сервер аутентификации выдает JWT, подписанный закрытым ключом (подписание ДОЛЖНО быть асимметричным - RS256 является одним из примеров), который вы сохраняете только на сервере аутентификации; не передавайте этот закрытый ключ другим микросервисам, внутри которых вы хотите проверить JWT. Что вы можете сделать, так это получить открытый ключ на основе закрытого ключа, которым вы подписываете свои токены, и опубликовать его на конечной точке на вашем сервере аутентификации, которая не требует аутентификации — открытый ключ будет представлен в форме ЮВК (см. ссылку на спец). Google делает нечто подобное здесь. Затем в каждом из ваших микросервисов вашей библиотеке нужно будет разработать способ выполнения запроса GET к конечной точке открытого ключа на вашем сервере аутентификации каждые X минут, чтобы увидеть, есть ли какие-либо изменения, и кэшировать открытый ключ в каждом микросервисе. Кэшируя открытый ключ в микрослужбе, вы сможете проверить запрашивающий JWT внутри запрашиваемой службы.

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

Это потребует немного больше работы заранее, но даст вам огромное количество простоты, гибкости и спокойствия в будущем, зная, что только один источник знает ваш закрытый ключ.

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

html_programmer 19.01.2020 23:14

@Chappie Johnson, не могли бы вы предоставить какую-нибудь ссылку или демонстрационный проект, который хорошо описывает тот же самый поток?

Dhwanil Patel 29.01.2020 09:53

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

Marco Prins 23.01.2021 09:34

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