Netflix Zuul 2 API-интерфейс аутентификации / проверки подлинности запросов (без Spring) - PullRequest
0 голосов
/ 07 июля 2019

Я хотел бы поставить 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 запрос к нисходящему бэкэнд-сервису.

  1. Существует ли стандартный подход для выполнения этого внешнего вызова из входящего фильтра в службу?

  2. Нужно ли мне импортировать другую библиотеку с HttpClient и т. Д. Для достижения этой цели?

  3. Есть ли другой / лучший подход для обработки этого потока?

Я понимаю, что для нормальной маршрутизации от входящего фильтра до конечной точки может использоваться 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
  1. Есть ли способ настроить службу аутентификации таким образом и подключить ее к потоку, т.е. запрос >> проверить токен авторизации (запрос на обслуживание, ответ) >> продолжить исходный запрос?
...