Openresty - Keycloak - lua-resty-openidc не работает должным образом
Я использую Keycloak у своего провайдера IAM и хотел бы использовать OpenResty вместе сlua-resty-openidc
плагин для реализации аутентификации для всех моих серверных приложений. Openresty предоставит мне эти приложения. У меня он почти работает, так что мне нужна только помощь, чтобы довести его до финиша.
Вот моя установка:
Я создал область Keycloak и клиент сAccess type: confidential
иValid Redirect URIs: *.mydomain.com
. Здесь ничего особенного, базовая конфигурация.
OpenResty работает как контейнер Docker в моем кластере Kubernetes, вот файл Dockerfile, который я использовал для создания образа:
FROM openresty/openresty:alpine-fat
# install dependencies
RUN ["luarocks", "install", "lua-resty-session"]
RUN ["luarocks", "install", "lua-resty-http"]
RUN ["luarocks", "install", "lua-resty-jwt"]
RUN ["luarocks", "install", "lua-resty-openidc"]
EXPOSE 443
Вот моя конфигурация Nginx:
server_name cs.mydomain.com;
ssl_certificate /etc/letsencrypt/live/mydomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/mydomain.com/privkey.pem;
expires 0;
add_header Cache-Control private;
location / {
resolver kube-dns.kube-system.svc.cluster.local;
access_by_lua_block {
local opts = {
redirect_uri = "https://cs.mydomain.com/redirect_uri",
discovery = "https://keycloak.mydomain.com/realms/mdos/.well-known/openid-configuration",
client_id = "openresty",
client_secret = "<secret>",
scope = "openid",
redirect_uri_scheme = "https",
session_contents = {id_token=true}
}
local res, err = require("resty.openidc").authenticate(opts)
if err then
ngx.status = 403
ngx.say(err)
ngx.exit(ngx.HTTP_FORBIDDEN)
end
ngx.req.set_header("X-USER", res.id_token.sub)
}
proxy_pass http://my-app.openresty.svc.cluster.local:8080;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_http_version 1.1;
proxy_cache_bypass $http_upgrade;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection upgrade;
proxy_set_header Host $host;
proxy_set_header Accept-Encoding gzip;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Port $server_port;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 30;
proxy_send_timeout 30;
proxy_headers_hash_bucket_size 128;
}
ПРИМЕЧАНИЕ. Если я удалю
access_by_lua_block
блокировать из файла конфигурации, я могу без проблем получить доступ к своему серверному приложению, поэтому я знаю, что конфигурация Kubernetes/Openresty работает должным образом без использования аутентификации OIDC. Так жеresolver kube-dns.kube-system.svc.cluster.local;
вlocation
раздел необходим, потому что я обычно просматриваю переменную, чтобы установитьproxy_pass
значение, а не жестко кодировать его, как в приведенном выше примере, и, поскольку это вызывает новое разрешение DNS внутри кластера, мне пришлось указать, какой DNS-сервер использовать, в данном случае внутренний сервер kubernetes.
Стоит отметить, что Keycloak и Openresty основаны на TLS/HTTPS с действительным сертификатом. Бэкэнд-приложение, работающее в kubernetes, основано на HTTP.
Итак, что происходит, когда я пытаюсь получить доступ к моему приложению
Меня перенаправляют на страницу входа в keycloak, как и ожидалось. Затем я ввожу свои учетные данные и нажимаю Enter:
- В Firefox я вижу страницу Keycloak с сообщением об ошибке «Страница не найдена».
- В Chrome я получаю доступ к домашней странице своего приложения, но все подзапросы к домену получают ошибку 404 (взятую из ошибок консоли браузера). Когда я обновляю страницу, я попадаю на домашнюю страницу keycloak (та, которая доступна в
https://keycloak.mydomain.com/
), но URL-адрес браузера указывает на .
Я посмотрел в журналы OpenResty, там ничего нет, как будто и не было ошибки с самого начала. Журналы, которые генерируются при использовании Chrome до того момента, когда я первоначально попадаю в свое целевое приложение:
82.169.48.99 - - [28/Jul/2022:11:25:08 +0000] "GET / HTTP/1.1" 302 151 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36"
192.169.29.71 - - [28/Jul/2022:11:25:19 +0000] "GET /redirect_uri?state=cd3c04ca2a84c3e9ce56d78072532989&session_state=550632d9-8b26-4fbd-aaa6-d184b829e812&code=89c8097d-ff4b-438c-95fd-738ccf16cf08.550632d9-8b26-4fbd-aaa6-d184b829e812.6eb80500-f1a7-4614-a638-652ad14cd44b HTTP/1.1" 302 151 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36"
192.169.29.71 - - [28/Jul/2022:11:25:19 +0000] "GET / HTTP/1.1" 200 1875 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36"
192.169.29.71 - - [28/Jul/2022:11:25:19 +0000] "GET /manifest.json HTTP/1.1" 200 230 "https://cs.mdundek.network/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36"
Затем журналы, когда я обновляю страницу и попадаю на домашнюю страницу keycloak, хотя мой браузер все еще указывает наcs.mydomain.com
:
192.169.29.71 - - [28/Jul/2022:11:27:34 +0000] "GET /stable-30d9c6cd9483b2cc586687151bcbcd635f373630?type=Management&reconnectionToken=32942905-b0b2-4074-b801-75cacec311d6&reconnection=true&skipWebSocketFrames=false HTTP/1.1" 101 171 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36"
192.169.29.71 - - [28/Jul/2022:11:27:34 +0000] "GET /stable-30d9c6cd9483b2cc586687151bcbcd635f373630?type=ExtensionHost&reconnectionToken=26321ffb-cb7b-476a-81ec-c5847aa42822&reconnection=true&skipWebSocketFrames=false HTTP/1.1" 101 372 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36"
192.169.29.71 - - [28/Jul/2022:11:27:37 +0000] "GET /stable-30d9c6cd9483b2cc586687151bcbcd635f373630?type=Management&reconnectionToken=32942905-b0b2-4074-b801-75cacec311d6&reconnection=true&skipWebSocketFrames=false HTTP/1.1" 101 172 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36"
192.169.29.71 - - [28/Jul/2022:11:27:37 +0000] "GET /stable-30d9c6cd9483b2cc586687151bcbcd635f373630?type=ExtensionHost&reconnectionToken=26321ffb-cb7b-476a-81ec-c5847aa42822&reconnection=true&skipWebSocketFrames=false HTTP/1.1" 101 330 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36"
Никаких ошибок, не уверен, что здесь происходит. На данный момент я даже не уверен, связана ли проблема с Keycloak или Openresty.