Я хотел бы поставить Netflix Zuul 2 (https://github.com/Netflix/zuul)) перед своими службами и выполнить некоторую аутентификацию / проверку входящих запросов.
Каждый запрос, который проходит через шлюз API, например, /api/service1/value
будет иметь токен авторизации, и я хотел бы проверить этот токен, прежде чем перенаправлять запрос в соответствующую серверную службу.
У меня есть несколько вопросов, и я надеялся, что кто-то может указать мне правильное направление.
Входящий фильтр кажется подходящим местом для размещения этой логики.
На данный момент я понимаю, что это можно сделать так:
class RequestAuthenticationFilter extends HttpInboundSyncFilter {
@Override
HttpRequestMessage apply(HttpRequestMessage request) {
// extract header with token and call auth service to validate it
if (ifTokenNotValid) {
// returns a 401
request.getContext()
.setEndpoint(UnauthorizedRequestEndpoint.class.getCanonicalName())
}
// continue filter chain
return request
}
}
В чем я не уверен, так это в том, как сделать этот вызов службе аутентификации и получить ответ во входящем фильтре, чтобы можно было проверить ответ и предпринять соответствующее действие - либо вернуть 401, либо продолжить маршрутизацию /api/service1/value
запрос к нисходящему бэкэнд-сервису.
Существует ли стандартный подход для выполнения этого внешнего вызова из входящего фильтра в службу?
Нужно ли мне импортировать другую библиотеку с HttpClient и т. Д. Для достижения этой цели?
Есть ли другой / лучший подход для обработки этого потока?
Я понимаю, что для нормальной маршрутизации от входящего фильтра до конечной точки может использоваться ProxyEndpoint:
config входящего фильтра:
...
if (path in request matches) {
context.setEndpoint(ZuulEndPointRunner.PROXY_ENDPOINT_FILTER_NAME)
context.setRouteVIP("service1")
}
return request
Либо Eureka config:
service1.ribbon.NIWSServerListClassName=com.netflix.niws.loadbalancer.DiscoveryEnabledNIWSServerList
service1.ribbon.DeploymentContextBasedVipAddresses=authservice
или список серверов, настроенных вручную:
service1.ribbon.listOfServers=localhost:8080
service1.ribbon.client.NIWSServerListClassName=com.netflix.loadbalancer.ConfigurationBasedServerList
- Есть ли способ настроить службу аутентификации таким образом и подключить ее к потоку, т.е.
запрос >> проверить токен авторизации (запрос на обслуживание, ответ) >> продолжить исходный запрос?