Фон
Я хочу реализовать проект, представленный в этой статье .
Это можно резюмировать на диаграмме ниже:
- Клиент сначала выполняет аутентификацию с помощью IDP (OpenID Connect/OAuth2)
- IDP возвращает токен доступа (непрозрачный токен без информации пользователя)
- Клиент делает вызов через шлюз API, используя токен доступа в заголовке авторизации
- Шлюз API делает запрос к IDP с помощью токена доступа
- IDP проверяет, что токен доступа действителен и возвращает пользовательскую информацию в формате JSON.
- Шлюз API хранит информацию пользователя в JWT и подписывает ее с помощью закрытого ключа. Затем JWT передается в службу нисходящего потока, которая проверяет JWT с использованием открытого ключа
- Если служба должна вызывать другую службу для выполнения запроса, она передает JWT, по которому выполняется аутентификация и авторизация для запроса.
Что я до сих пор
У меня больше всего сделано, используя:
- Spring облако как глобальная структура
- Spring для запуска отдельных служб
- Netflix Zuul как шлюз API
Я также написал фильтр Zuul PRE, который проверяет токен доступа, связывается с IDP и создает JWT. Затем JWT добавляется в заголовок для запроса, перенаправленного в нисходящую службу.
Проблема
Теперь мой вопрос весьма специфичен для Zuul и его фильтров. Если по какой-либо причине аутентификация не удалась в шлюзе API, как я могу остановить маршрутизацию и ответить напрямую с помощью 401, не продолжая цепочку фильтров и переадресацию вызова?
В настоящий момент, если аутентификация завершается неудачей, фильтр не добавит JWT в заголовок, а 401 будет поступать из нисходящей службы. Я надеялся, что мой шлюз может предотвратить этот ненужный звонок.
Я попытался понять, как использовать com.netflix.zuul.context.RequestContext
для этого, но документация довольно плохая, и я не мог найти способ.