Сценарий
У меня есть защищенный веб-сервис (JakartaEE + Microprofile + JWT), работающий в открытом доступе. В качестве эмитента токена jwt я использую keycloak. Для тестирования и разработки я хочу запустить обе службы в docker. Поэтому я написал docker -композитный файл. В качестве тестового клиента я использую JUnit с microprofile-client. Это работает за пределами docker.
Проблема
Я могу получить токен JWT через локальный хост на хосте, например:
POST /auth/realms/DC/protocol/openid-connect/token HTTP/1.1
Host: localhost:8080
Content-Type: application/x-www-form-urlencoded
realm=DC&grant_type=password&client_id=dc&username=dc_editor&password=******
Проблема в том, что с точки зрения webservice localhost не является сервером keycloak. JWT-Token-Validation против эмитента завершается неудачей.
Цель
Я хочу получить доступ к серверу keycloak с хоста с его docker -наличным внутренним сетевым псевдонимом - например, dcAuthServer
. JWT-токен будет проверен правильно.
Код
Файл docker -composite выглядит следующим образом:
version: "3.8"
services:
dcWebservice:
environment:
- DC_AUTH_SERVER_HOST=dcAuthServer
- DC_AUTH_SERVER_PORT=8080
- DC_AUTH_SERVER_REALM=DC
image: dc_webservice:latest
ports:
- "9080:9080"
networks:
- dcNetwork
dcAuthServer:
image: dc_keycloak:latest
ports:
- "8080:8080"
networks:
dcNetwork:
aliases:
- dcAuthServer
healthcheck:
test: "curl --fail http://localhost:8080/auth/realms/DC || false"
networks:
dcNetwork:
Среда DC_AUTH*
используется в mpJwt-конфигурация в server.xml
сервера open liberty:
<mpJwt id="dcMPJWT" audiences="dc" issuer="http://${DC_AUTH_SERVER_HOST}:${DC_AUTH_SERVER_PORT}/auth/realms/${DC_AUTH_SERVER_REALM}"
jwksUri="http://${DC_AUTH_SERVER_HOST}:${DC_AUTH_SERVER_PORT}/auth/realms/${DC_AUTH_SERVER_REALM}/protocol/openid-connect/certs"/>
В issuer
я должен поставить доверенного эмитента для токена JWT.
Надеюсь Я не забыл важную информацию - просто спросите!
Заранее спасибо Роберт