Я использую 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
Спасибо.