Как стать автором
Обновить

Комментарии 12

А где Gateway хранит токен? Сохраняет в сессию в БД? Или помещает в куку, которую отдает пользователю?

Клиент хранит его сам у себя. Правильный флоу для api это не использовать куки, иначе привет CSRF

Клиентом в данной ситуации является Gateway. У него есть и id, и secret, и получение токена идет через back-channel. Токен он, судя по диаграмме, на сторону UserAgent не отдает, а пользуется им от имени resource owner. Ну и кука, как я понял, здесь используется (`RemoveRequestHeader=Cookie `)...

В приведенном примере же видно, что нет никой БД, и куки на гейте удаляются. Я думаю, что оно вообще stateless, ничего не хранит, а только ретранслирует. В официальной документации не припоминаю, чтобы про хранение что-то было. Дословно, как это работает, там так: "The filter extracts an access token from the currently authenticated user, and puts it in a request header for the downstream requests."

"The filter extracts an access token from the currently authenticated user" - извлекает из куки (ранее созданной самим Gateway)? Или gateway отдает пользователю токен в незашифрованном виде, а UserAgent сам хранит этот токен и передает на gateway через заголовок "Authorization: Bearer ..."?

И спасибо за статью. Я сам не джавист, было интересно посмотреть, как у вас реализуется auth. Выглядит очень удобно: gateway с минимумом кода - круть!

Сам filter никак этим не управляет, он лишь достает Authentication из security context. А тем, как этот токен хранится, управляет ServerSecurityContextRepository.

Из коробки, в spring есть всего одна реализация (кроме noop): WebSessionServerSecurityContextRepository.

Для хранения сессий есть отдельный проект spring-session, но по умолчанию in-memory, а клиенту возвращается cookie с id сессии.

Таким образом, нужно обязательно учитывать (например при настройке политики балансировки на внешнем балансировщике), что gateway stateful.

Реализовать хранение токена (или даже всей сессии) в cookies несложно самому. На это даже висит issue, но ее не закрывают, как я понимаю, по каким-то религиозным причинам.

Вот теперь ситуация понятна. Спасибо!

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

А как подключить еще api-docs к resource проекту с авторизацией?

Ребят, почитайте как это в принципе в Spring Security делается, клонируйте мой код с гитхаба и поэкспериментируйте. Я сам так делаю, когда мне надо в чем-то разобраться. Там это не сильно сложно должно быть. В конце статьи есть ссылки на документацию, может там что найдете.

А чем это лучше стандартной реализации Authorization Code Flow - https://auth0.com/docs/get-started/authentication-and-authorization-flow/authorization-code-flow ?

И где брать библиотеки, например, для React и Angular для работы с флоу в данной статье?

Для мобилы (Android/iOS) тоже есть ряд стандартных библиотек для Authorization Code Flow, т.е. вопрос тоже открытый как работать с мобилы с таким API Gateway.

Если подытожить, зачем что-то менять, если и так всё хорошо работает будь то API Gateway, BFF или просто API (для клиента это только детали реализации)?

Чем лучше или хуже можно будет обсудить, когда увижу реализацию в виде рабочего проекта на гитхабе. Я бы с удовольствием перенял опыт, может быть. Зачем что-то менять, если и так всё хорошо - да, наверное, незачем.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации