Отладка сторонних аутентификаций в localhost с помощью docker и nginx

#docker #authentication #nginx #localhost

Вопрос:

У нас есть веб-сайт, на котором мы только что добавили сторонние средства аутентификации, такие как Google, Twitter. Я пытаюсь проверить эти проверки подлинности в localhost (macOS).

Я запускаю докер для запуска nginx, вот docker-compose-dev.xml

 version: "3"
services:
  https:
    image: bitnami/nginx:latest
    restart: unless-stopped
    ports:
      - 443:443/tcp
    volumes:
      - ./conf.d/dev.conf:/opt/bitnami/nginx/conf/server_blocks/default.conf:ro
    extra_hosts:
      - "host.docker.internal:host-gateway"
 

И вот conf.d/dev.conf :

 upstream funfun {
   server 178.62.87.72:443;
}
server {
    listen  443 ssl;
    server_name localhost;
    ssl_certificate /certs/server.crt;
    ssl_certificate_key /certs/server.key;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    ssl_session_timeout 1d;
    ssl_stapling off;
    ssl_stapling_verify off;
    add_header Strict-Transport-Security max-age=15768000;
    add_header X-Frame-Options "";
    proxy_ssl_name "www.funfun.io";
    proxy_ssl_server_name on;
    location ~ /socialLoginSuccess {
        rewrite ^ '/#/socialLoginSuccess' redirect;
     }
    location ~ /auth/(.*) {
        proxy_pass  https://funfun/10studio/auth/$1?$query_string;
        proxy_set_header Host localhost;
     }
    location / {
        proxy_set_header    Host                $host;
        proxy_set_header    X-Forwarded-For     $proxy_add_x_forwarded_for;
        proxy_set_header    X-Forwarded-Proto   $scheme;
        proxy_set_header    Accept-Encoding     "";
        proxy_set_header    Proxy               "";
        proxy_pass          http://host.docker.internal:3000/;
        # These three lines added as per https://github.com/socketio/socket.io/issues/1942 to remove socketio error
        proxy_http_version 1.1;
        proxy_set_header   Upgrade $http_upgrade;
        proxy_set_header   Connection "upgrade";
    }
}
 

Способ, которым мы запускаем приложение, таков sudo PORT=8000 HTTPS=true ./node_modules/.bin/react-scripts start . Затем https://localhost:8000/#/sign в браузере открывается страница, на которой находятся кнопки аутентификации.

URL-адрес кнопки, ссылающейся на аутентификацию Google, таков https://localhost/10studio/auth/google . Нажав на нее, я вижу сначала https://localhost/10studio/auth/google в адресной строке браузера, но страница для ввода Google ID и пароля не отображается, затем через несколько секунд появляется URL https://localhost/#/socialLoginSuccess -адрес, и страница отображается 502 Bad Gateway . Я вижу следующие журналы в терминале, на котором работает nginx:

 $ docker-compose --f docker-compose-dev.yml up
WARNING: Found orphan containers (frontend_10studio_1, frontend_frontend_1) for this project. If you removed or renamed this service in your compose file, you can run this command with the --remove-orphans flag to clean it up.
Starting frontend_https_1 ... done
Attaching to frontend_https_1
https_1  | nginx 21:24:05.37 
https_1  | nginx 21:24:05.38 Welcome to the Bitnami nginx container
https_1  | nginx 21:24:05.38 Subscribe to project updates by watching https://github.com/bitnami/bitnami-docker-nginx
https_1  | nginx 21:24:05.39 Submit issues and feature requests at https://github.com/bitnami/bitnami-docker-nginx/issues
https_1  | nginx 21:24:05.39 
https_1  | nginx 21:24:05.39 INFO  ==> ** Starting NGINX setup **
https_1  | nginx 21:24:05.42 INFO  ==> Validating settings in NGINX_* env vars
https_1  | nginx 21:24:05.43 INFO  ==> Initializing NGINX
https_1  | realpath: /bitnami/nginx/conf/vhosts: No such file or directory
https_1  | 
https_1  | nginx 21:24:05.45 INFO  ==> ** NGINX setup finished! **
https_1  | nginx 21:24:05.47 INFO  ==> ** Starting NGINX **
https_1  | 172.19.0.1 - - [08/Nov/2021:21:25:06  0000] "GET /10studio/auth/google HTTP/1.1" 302  0 "https://localhost:8000/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36" "-"
https_1  | 172.19.0.1 - - [08/Nov/2021:21:25:07  0000] "GET /auth/google/callback?code=4/0AX4XfWiqleRl2StBpNOgOtzjqZlftvq9-uDmiPVLZqcgo2xjjhohu47iAV5qxoJThaQYzgamp;scope=email profile https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/userinfo.email openidamp;authuser=0amp;prompt=none HTTP/1.1" 302  82 "https://localhost:8000/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36" "-"
https_1  | 172.19.0.1 - - [08/Nov/2021:21:25:07  0000] "GET /auth/signinSuccess HTTP/1.1" 302  82 "https://localhost:8000/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36" "-"
https_1  | 172.19.0.1 - - [08/Nov/2021:21:25:07  0000] "GET /socialLoginSuccess HTTP/1.1" 302  138 "https://localhost:8000/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36" "-"
https_1  | 2021/11/08 21:25:39 [error] 27#27: *2 connect() failed (110: Connection timed out) while connecting to upstream, client: 172.19.0.1, server: localhost, request: "GET / HTTP/1.1", upstream: "http://192.168.65.1:3000/", host: "localhost", referrer: "https://localhost:8000/"
https_1  | 172.19.0.1 - - [08/Nov/2021:21:25:39  0000] "GET / HTTP/1.1" 502  552 "https://localhost:8000/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36" "-"
 

Does anyone know what’s wrong here?

Additionally, when I debug nginx, it is like a black box for me. I really want to be able to trace and see which url enters which location block, and changes to which url (by proxy_pass or rewrite , etc.). Does anyone have a better way to debug or log that?

Edit 1:

I tried also another slightly different docker-compose-dev.xml :

 version: "3"
services:
  https:
    image: bitnami/nginx:latest
    restart: unless-stopped
    ports:
      - 443:443/tcp
    volumes:
      - ./conf.d/dev.mac.conf:/opt/bitnami/nginx/conf/server_blocks/default.conf:ro
    extra_hosts:
      - "172.17.0.1:host-gateway"
 

And slight different dev.mac.conf :

 upstream funfun {
   server 178.62.87.72:443;
}
server {
    listen 443 ssl;
    server_name localhost;
    ssl_certificate /certs/server.crt;
    ssl_certificate_key /certs/server.key;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    ssl_session_timeout 1d;
    ssl_stapling off;
    ssl_stapling_verify off;
    add_header Strict-Transport-Security max-age=15768000;
    add_header X-Frame-Options "";
    proxy_ssl_name "www.funfun.io";
    proxy_ssl_server_name on;
    location ~ /socialLoginSuccess {
        rewrite ^ '/#/socialLoginSuccess' redirect;
     }
    location ~ /auth/(.*) {
        proxy_pass  https://funfun/10studio/auth/$1?$query_string;
        proxy_set_header Host localhost;
     }
    location / {
        proxy_set_header    Host                $host;
        proxy_set_header    X-Forwarded-For     $proxy_add_x_forwarded_for;
        proxy_set_header    X-Forwarded-Proto   $scheme;
        proxy_set_header    Accept-Encoding     "";
        proxy_set_header    Proxy               "";
        proxy_pass          http://172.17.0.1:8000/;

        # These three lines added as per https://github.com/socketio/socket.io/issues/1942 to remove socketio error
        proxy_http_version 1.1;
        proxy_set_header   Upgrade $http_upgrade;
        proxy_set_header   Connection "upgrade";
    }
}
 

Я все еще запускаю приложение sudo PORT=8000 HTTPS=true ./node_modules/.bin/react-scripts start . На этот раз https://localhost:8000/#/sign в браузере откроется страница, на которой находится кнопка аутентификации. Нажатие на кнопку, связанную с https://localhost/10studio/auth/google , открывает страницу аутентификации Google. После успешной аутентификации URL-адрес становится https://localhost/#/socialLoginSuccess , и страница отображается 502 Bad Gateway . Однако правильный URL-адрес был бы https://localhost:8000/#/socialLoginSuccess .

Вот журнал:

 https_1  | nginx 03:12:10.32 INFO  ==> ** Starting NGINX **
https_1  | 172.19.0.1 - - [12/Nov/2021:03:12:28  0000] "GET /10studio/auth/google HTTP/1.1" 302  0 "https://localhost:8000/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:94.0) Gecko/20100101 Firefox/94.0" "-"
https_1  | 172.19.0.1 - - [12/Nov/2021:03:12:46  0000] "GET /auth/google/callback?code=4/0AX4XfWgQ8g3LC6nYxBbk-BjBq0cWGFcfSwoPWZbC8Rky0IVngpAtKTTuYIbYsgbW96g6Dgamp;scope=email profile https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/userinfo.email openidamp;authuser=0amp;prompt=consent HTTP/1.1" 302  82 "https://accounts.google.fr/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:94.0) Gecko/20100101 Firefox/94.0" "-"
https_1  | 172.19.0.1 - - [12/Nov/2021:03:12:46  0000] "GET /auth/signinSuccess HTTP/1.1" 302  82 "https://accounts.google.fr/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:94.0) Gecko/20100101 Firefox/94.0" "-"
https_1  | 172.19.0.1 - - [12/Nov/2021:03:12:46  0000] "GET /socialLoginSuccess HTTP/1.1" 302  138 "https://accounts.google.fr/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:94.0) Gecko/20100101 Firefox/94.0" "-"
https_1  | 172.19.0.1 - - [12/Nov/2021:03:12:46  0000] "GET / HTTP/1.1" 502  150 "https://accounts.google.fr/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:94.0) Gecko/20100101 Firefox/94.0" "-"
https_1  | 2021/11/12 03:12:46 [error] 28#28: *1 connect() failed (111: Connection refused) while connecting to upstream, client: 172.19.0.1, server: localhost, request: "GET / HTTP/1.1", upstream: "http://172.17.0.1:8000/", host: "localhost", referrer: "https://accounts.google.fr/"
https_1  | 172.19.0.1 - - [12/Nov/2021:03:12:46  0000] "GET /favicon.ico HTTP/1.1" 502  150 "https://localhost/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:94.0) Gecko/20100101 Firefox/94.0" "-"
https_1  | 2021/11/12 03:12:46 [error] 28#28: *1 connect() failed (111: Connection refused) while connecting to upstream, client: 172.19.0.1, server: localhost, request: "GET /favicon.ico HTTP/1.1", upstream: "http://172.17.0.1:8000/favicon.ico", host: "localhost", referrer: "https://localhost/"
 

Я считаю, что эта версия файлов конфигурации ближе к правильному решению. Единственная проблема заключается в том, что окончательный URL-адрес должен быть https://localhost:8000/#/socialLoginSuccess вместо https://localhost/#/socialLoginSuccess . Кто-нибудь знает, как этого добиться?

Ответ №1:

У вас есть ошибка в журналах (и это не проблема с аутентификацией):

 [error] 27#27: *2 connect() failed (110: Connection timed out) while connecting to upstream, client: 172.19.0.1, server: localhost, request: "GET / HTTP/1.1", upstream: "http://192.168.65.1:3000/"
 

Ваш контейнер nginx не может достичь настроенного вверх по течению ( http://host.docker.internal:3000/ ). Причин этой ошибки может быть много: неправильная конфигурация сети/порта, раскрытие портов, у самого moby могут быть собственные ошибки с конфигурацией хоста.докера.внутренней DNS, …

Ответ №2:

Поток OAUTH происходит успешно. Обратите внимание, что большая часть потока происходит против localhost:8000, что означает обход nginx и прямой доступ к вашему приложению. Ваше приложение работает на порту 8000, но вы настроили nginx для подключения к «восходящему потоку» (вашему приложению) на порту 3000 (см. Конфигурацию nginx).

В конце потока запрос больше не направляется непосредственно в ваше приложение, а направляется в nginx, который затем пытается подключиться к вашему приложению/восходящему потоку через порт 3000, который не работает, потому что ваше приложение работает на 8000.

Обновите конфигурацию nginx, указав порт 8000, и повторите попытку.

Я бы также посоветовал вам протестировать весь поток подключения к nginx, а не подключаться напрямую к вашему приложению на порту 8000, чтобы уменьшить путаницу.

 https_1  | 172.19.0.1 - - [08/Nov/2021:21:25:07  0000] "GET /socialLoginSuccess HTTP/1.1" 302  138 "https://localhost:8000/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36" "-"
https_1  | 2021/11/08 21:25:39 [error] 27#27: *2 connect() failed (110: Connection timed out) while connecting to upstream, client: 172.19.0.1, server: localhost, request: "GET / HTTP/1.1", upstream: "http://192.168.65.1:3000/", host: "localhost", referrer: "https://localhost:8000/"
 

Комментарии:

1. Я заменил proxy_pass http://host.docker.internal:3000/; на proxy_pass http://172.17.0.1:8000/; in docker-compose-dev.xml и host.docker.internal:host-gateway на 172.17.0.1:host-gateway in dev.conf . Успешная аутентификация все равно привела к https://localhost/#/socialLoginSuccess тому , что вместо https://localhost:8000/#/socialLoginSuccess этого вот журнал .

2. Я добавил более подробную информацию в ОП.

3. > Успешная аутентификация по-прежнему приводила к > localhost/#/socialLoginSuccess вместо localhost:8000/#/socialLoginSuccess Обычно вы выполняете все запросы к nginx на 443 и закрываете брандмауэр для порта приложения (8000), кроме localhost. Затем убедитесь, что ваше приложение аутентификации настроено для работы с локальным хостом, чтобы избежать путаницы. Из вашего журнала я вижу «Отказано в подключении при подключении к восходящему… 172.17.0.1:8000 «. Есть ли приложение, работающее на этом IP/порту? Есть ли в журналах этого приложения ошибка/сбой?