Istio OAuth2 с брелоком - PullRequest
       41

Istio OAuth2 с брелоком

0 голосов
/ 14 марта 2019

Я использую Istio в качестве шлюза API и сервисной сетки.Планируется, что поток аутентификации и авторизации (oauth2) будет управляться входным шлюзом-посланником в Истио.Однако использование фильтров Envoy не перенаправляет URL-запрос на страницу входа в систему, как ожидалось (приведенный ниже пример можно найти в здесь , а вход в систему не происходит. Если я пытаюсь подключиться с помощью curl (authenticateиспользуйте токен, полученный для получения авторизации), он работает нормально, но когда задействует поток Oauth 2. он застревает. Эти авторизации выполняются с использованием Keycloak .

ЭтоИспользуемый фильтр Lua:

apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
  name: authn-filter
  namespace: istio-test
spec:
  filters:
  - filterConfig:
      inlineCode: |
        function login (request_handle)
          request_handle:logInfo("logging in")
          local request_url = "http://"..request_handle:headers():get(":authority")..request_handle:headers():get(":path")
          request_handle:logInfo(request_url)
          headers, body = request_handle:httpCall(
            "outbound|3000||service-gatekeeper.istio-test.svc.cluster.local",
            {
              [":method"] = "POST",
              [":path"] = "/oauth/authorize",
              [":authority"] = request_handle:headers():get(":authority"),
              ["X-Auth-Request-Redirect"] = request_url
            },
            nil,
            5000)
          return headers, body
        end
        function envoy_on_request(request_handle)
          local path = request_handle:headers():get(":path")
          -- ignore metrics, liveness probe requests
          request_handle:logInfo("Envoy on Request")
          if path == "/" then
            return
          end
          token = request_handle:headers():get("Authorization")
          cookie = request_handle:headers():get("Cookie")
          if token == nil and cookie == nil then
             request_handle:logInfo("about to login")
             headers, body = login(request_handle)
             request_handle:respond(headers,body)
          end
          request_handle:logInfo("validating token against Certs")
          local headers, body = request_handle:httpCall(
            "outbound|8080||eseabyr-oauth2-proxy-innulic-test.svc.cluster.local",
            {
              [":method"] = "GET",
              [":path"] = "/oauth/authorize",
              [":authority"] = request_handle:headers():get(":authority"),
              ["Authorization"] = token,
              ["Cookie"] = cookie
            },
            nil,
            5000)
          local status
          for header, value in pairs(headers) do
            if header == ":status" then
               status = value
            end
          end

          request_handle:logInfo("token validation status:"..status)
          if status == "401" then
            headers, body = login(request_handle)
            request_handle:respond(headers,body)
          end
        end
        -- Called on the response path.
        function envoy_on_response(response_handle)
            local headers = response_handle:headers()
            headers:add("X-Envoy-Ingress", os.getenv("HOSTNAME"))
        end
    filterName: envoy.lua
    filterType: HTTP
    listenerMatch:
      listenerType: GATEWAY

Спасибо.

1 Ответ

0 голосов
/ 07 мая 2019

Поскольку у меня нет полной информации о вашей среде, я могу предложить следующее для устранения проблемы:

  1. Я вижу, что у вас нет workloadLabels,Это означает, что этот фильтр должен быть подключен ко всем модулям в вашей сетке.
  2. Убедитесь, что контейнеры istio init вводятся в ваши модули (либо с помощью istioctl, либо с помощью контроллеров доступа k8s)
  3. Проверьте журналыпрокси коляски, прикрепленной к интересующему вас стручку.Я предполагаю, что есть некоторая синтаксическая ошибка, которая полностью отключит фильтр.В противном случае он должен дать вам понять, что происходит с фильтром.
...