Я пытаюсь запустить тестовый клиент OAuth2 в той же сети Docker, что и сервер OAuth2. Идея состоит в том, чтобы разрешить тестирование всего приложения без необходимости запуска внешнего клиента OAuth2.
Проблема, с которой я сталкиваюсь, заключается в том, что конечная точка сервера OAuth2, которая передается клиенту OAuth2, доступна только за пределами сети Docker на моем локальном компьютере (для этого я использую простой прокси-сервер nginx, см. Ниже). Поэтому, когда клиент пытается получить токен при вызове обратного вызова, он не может разрешить имя хоста (поскольку «localhost» в контексте контейнера клиента ссылается на локальную сеть этого контейнера, но «localhost» в моем браузере относится к самой сети Docker). В идеале я хотел бы продолжать использовать nginx в качестве прокси для более хороших имен хостов во время разработки.
Чтобы уточнить, этот процесс в настоящее время работает:
- Пользователь посещает app.localhost в своем браузере
- Пользователь перенаправляется на auth.localhost для попытки входа в систему
- Пользователь вводит свои учетные данные, пользователь перенаправляется на обратный вызов
- Ошибки обратного вызова, поскольку он не может правильно получить токен доступа из auth.localhost
Вот мой docker-compose, для краткости удалены нерелевантные части:
version: '3'
services:
hydra:
image: oryd/hydra:v1.0.0-beta.9
depends_on:
- hydra-migrate
command:
serve all --dangerous-force-http
environment:
- OAUTH2_ISSUER_URL=http://auth.localhost/
- OAUTH2_CONSENT_URL=http://auth.localhost/consent
- OAUTH2_LOGIN_URL=http://auth.localhost/auth/login
- DATABASE_URL=postgres://hydra@postgres:5432/hydra?sslmode=disable
- SYSTEM_SECRET=youReallyNeedToChangeThis
- OAUTH2_SHARE_ERROR_DEBUG=1
- OIDC_SUBJECT_TYPES_SUPPORTED=public,pairwise
- OIDC_SUBJECT_TYPE_PAIRWISE_SALT=youReallyNeedToChangeThis
nginx:
image: nginx
ports:
- "80:80"
volumes:
- ./docker/nginx/nginx.conf:/etc/nginx/nginx.conf:ro
depends_on:
- hydra
- oauth2-test
oauth2-test:
build: https://github.com/chatlogs/oauth2-simple-client.git
environment:
- APP_URL=http://app.localhost
- OAUTH2_URL=http://auth.localhost
- OAUTH2_CLIENT_ID=test
- OAUTH2_CLIENT_SECRET=secret
depends_on:
- hydra-create-client
А вот мой nginx.conf:
events {
worker_connections 1024;
}
http {
# Proxy ChatLogs Auth and Hydra OAuth server
server {
listen 80;
server_name auth.localhost;
location ^~ / {
proxy_pass http://chatlogs-auth:3000;
}
location ^~ /oauth2 {
proxy_pass http://hydra:4444/oauth2;
}
}
server {
listen 80;
server_name app.localhost;
location / {
proxy_pass http://oauth2-test:3000;
}
}
}
Это ошибка, которую показывает oauth2-test:
oauth2-test_1 | { Error: getaddrinfo ENOTFOUND auth.localhost auth.localhost:80
oauth2-test_1 | at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:57:26)
oauth2-test_1 | errno: 'ENOTFOUND',
oauth2-test_1 | code: 'ENOTFOUND',
oauth2-test_1 | syscall: 'getaddrinfo',
oauth2-test_1 | hostname: 'auth.localhost',
oauth2-test_1 | host: 'auth.localhost',
oauth2-test_1 | port: 80,
oauth2-test_1 | trace:
oauth2-test_1 | [ { method: 'POST', url: 'http://auth.localhost/oauth2/token' } ],
oauth2-test_1 | isBoom: true,
oauth2-test_1 | isServer: true,
oauth2-test_1 | data: null,
oauth2-test_1 | output:
oauth2-test_1 | { statusCode: 502,
oauth2-test_1 | payload:
oauth2-test_1 | { message:
oauth2-test_1 | 'Client request error: getaddrinfo ENOTFOUND auth.localhost auth.localhost:80',
oauth2-test_1 | statusCode: 502,
oauth2-test_1 | error: 'Bad Gateway' },
oauth2-test_1 | headers: {} },
oauth2-test_1 | reformat: [Function] }
Любая помощь приветствуется!