Должен ли шлюз API отвечать за авторизацию?

В настоящее время у меня есть монолитное приложение с Java / Spring Boot со следующими конечными точками:

  • /login
  • /logout
  • /some-resource

Чтобы получить доступ к some-resource, выполните следующие действия:

  1. Пользователь делает запрос POST к конечной точке /login. Если учетные данные верны, в заголовке возвращается токен JWT, в противном случае - 401.
  2. Пользователь отправляет токен JWT вместе с запросом на /some-resource. Если токен действителен, ресурс возвращается, в противном случае - 403.

Теперь я хочу разделить монолит на 2 службы: «AuthServer» и «SomeResourceServer». Сверху будет шлюз API. Я думаю о 2 возможных способах авторизации


Опция 1

  1. Пользователь делает запрос к конечной точке /login. Шлюз API пересылает его на «AuthServer». Если учетные данные верны, в заголовке возвращается токен JWT, в противном случае - 401. - Этот шаг такой же
  2. Пользователь отправляет токен JWT вместе с запросом на /some-resource. Шлюз API вызывает «AuthServer» для проверки токена JWT. Если токен действителен, шлюз API вызывает SomeResourceServer и возвращает результаты. В противном случае 403.

Вариант 2

  1. Пользователь делает запрос к конечной точке /login. Шлюз API пересылает его на «AuthServer». Если учетные данные верны, в заголовке возвращается токен JWT, в противном случае - 401. - Этот шаг такой же
  2. Пользователь отправляет токен JWT вместе с запросом на /some-resource. Шлюз API просто перенаправляет запрос на SomeResourceServer. Затем SomeResourceServer вызывает AuthServer для проверки токена JWT. Если токен действителен, ресурс возвращается, в противном случае - 403.

В варианте 1 шлюз API отвечает за авторизацию (связь с «AuthServer»), в варианте 2 связь осуществляется между серверами. Так какой вариант более правильный? Есть ли хорошие / плохие практики? А может другой способ / вариант?

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

Ответы 1

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

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

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

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

С другой стороны, вариант II дает вам свободу в том, что все ваши услуги защищены индивидуально. Если вы хотите, чтобы некоторые ресурсы какой-либо службы были доступны анонимно, вы также можете получить это. У вас также есть контроль над битом авторизации.

Все дело в компромиссах. Но я предпочитаю второй подход, так как у меня больше свободы.

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

Также при запросе ресурса, если токен недействителен, код ответа должен быть 401, а если токен действителен. Принципал не авторизован для доступа к ресурсу, ответ должен быть 403.

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

Спасибо за полезную информацию! Что касается проверки токенов JWT независимо, я думаю, что это зависит от того, какую проверку вы хотите сделать, например, если вы хотите проверить, был ли токен создан перед проверкой пароля или был ли токен недействителен (с запросом выхода), В этом В некоторых случаях я бы сказал, что запрос к Auth-серверу будет лучше. Также имеет смысл проверить токен с помощью Auth-сервера, если вы объедините этот запрос с получением роли. Как вы думаете?

haykart 06.06.2018 12:25

Существует два типа токена доступа к токену и токена обновления. AT недолговечен, и мы можем передавать его независимо, проверяя только с помощью открытого ключа. Сценарии выхода из системы можно обрабатывать с помощью токена обновления. т.е. AT не будет обновляться после выхода из системы. Если ваше приложение может жить с тем минимальным временем, в течение которого AT должен быть в живых, я думаю, вы можете избежать вызова сервера. Говоря о ролях, они тоже могут быть частью токена. Никто не может его изменить. С точки зрения микросервисов, повторный вызов auth server снова может быть серьезным недостатком, и именно здесь JWT сияет. Но все дело в компромиссах.

Anunay 06.06.2018 14:42

Большое спасибо за объяснение! Теперь мне стало понятнее. Еще одна вещь, не могли бы вы поделиться в своем ответе ссылками на учебники / статьи по этой теме? Я считаю, что это будет очень полезно, еще раз спасибо :)

haykart 07.06.2018 09:40

У меня нет какого-либо документа, которым я мог бы поделиться прямо сейчас, но я предлагаю узнать больше о JWT и OIDC (это то, что я использовал)

Anunay 09.06.2018 06:56

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