Проблема с настройкой - обслуживайте приложение реакции и бэкэнд с весенней загрузкой с помощью базовой http-аутентификации за обратным прокси-сервером nginx https, организованным докером - PullRequest
0 голосов
/ 17 октября 2018

Его

У меня есть проблема, которую я не могу решить.

Когда я запрашиваю свой бэкэнд Springboot, он работает нормально.Пароль спрашивается, когда я аутентифицируюсь, я получаю ответ.

Но, если я сначала вызову внешний интерфейс (базовая аутентификация также работает), но прокси-сервер nginx больше не пересылает запросы в бэкэнд-загрузчик.

Не могли бы вы, пожалуйстапомогите разобраться, что не так с моим конфигом.Я забыл настройку https?

На самом деле, если я выключаю ssl, то он работает отлично.И отключение базовой аутентификации с помощью ssl не решает проблему.

Спасибо за помощь

Вот еще несколько деталей:

  • У меня есть приложение реакции, созданное синструмент создания-реакции-приложения.
  • Приложение вызывает бэкэнд с пружинной загрузкой.
  • Я использую docker для запуска всего этого.
  • Я использую https, чтобы предотвратить ввод открытого пароля для обычной аутентификации.
  • Я работаю с моим приложением с таким примером: https://myPublicHostname (на порту 443)
  • Сервер должен быть доступен с таким именем: https://myPublicHostname/rest/myapi/

Вот моя структура файлов для развертывания:

WebDockerService
\-- my-react-app
    \-- public
    \-- src
    \-- package.json
    \-- default.conf
    \-- Dockerfile
    \-- fullchain.pem
    \-- htpasswd
    \-- privkey.pem
\-- my-api
    \-- my-api-0.0.1-SNAPSHOT.jar
    \-- Dockerfile
\-- docker-compose.yml

Вот мой файл Docker-compose

version: '3.1'
services:
  frontendwithproxy:
   build: ./my-react-app
   ports: 
     - 80:80
     - 443:443 
  springbootbackend:
   build: ./my-api
   ports:
     - 8080:8080
 networks:
  default:
    external:
      name: netDev

Вот Dockerfile «my-реагировать-приложение» для сборки сервера nginx

### STAGE 1: Build ###
FROM node:9.11.1 as build
RUN mkdir /usr/src/app
WORKDIR /usr/src/app
ENV PATH /usr/src/app/node_modules/.bin:$PATH
COPY package.json /usr/src/app/package.json
RUN npm install --silent
RUN npm install react-scripts -g --silent
COPY . /usr/src/app
RUN npm run build

### STAGE 2: Production Environment ###
FROM nginx:1.13.12-alpine

COPY fullchain.pem /etc/nginx/fullchain.pem
COPY privkey.pem /etc/nginx/privkey.pem
COPY default.conf /etc/nginx/conf.d/default.conf
COPY htpasswd /etc/nginx/conf.d/htpasswd
COPY --from=build /usr/src/app/build /usr/share/nginx/html

EXPOSE 80 443

CMD ["nginx", "-g", "daemon off;"]

Вот файл default.conf для nginx

server {
    #To redirect http traffic to ssl
    listen 80;
    return 301 https://myPublicHostname$request_uri;
}

server{

    listen          443 ssl;
    server_name     myPublicHostname;
    #root containing react app files
    root            /usr/share/nginx/html;

    #Basic authentication enabling
    auth_basic              "Restricted Access!";
    auth_basic_user_file    /etc/nginx/conf.d/htpasswd;

    #SSL Settings
    ssl_certificate /etc/nginx/fullchain.pem;
    ssl_certificate_key /etc/nginx/privkey.pem;
    ssl_session_timeout 1d;
    ssl_session_cache shared:SSL:50m;
    ssl_session_tickets off;
    ssl_ecdh_curve secp384r1;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers "ECDHE-RSA-CHACHA20-POLY1305:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-RSA-AES256-SHA";
    ssl_prefer_server_ciphers on;
    add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;";
    add_header X-Content-Type-Options nosniff;
    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Robots-Tag none;
    ssl_stapling on;
    ssl_stapling_verify on;

    #Location for springboot api
    location /rest {
        proxy_set_header        Host $host;
        proxy_set_header        X-Real-IP $remote_addr;
        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_http_version      1.1;
        proxy_set_header        Upgrade $http_upgrade;
        proxy_set_header        Connection "upgrade";
        proxy_set_header        X-Forward-Proto http;
        proxy_set_header        X-Nginx-Proxy true;

        proxy_redirect          off;
        proxy_pass              http://192.168.1.125:8080;          
    }
}

Вот Dockerfile для бэкэнда Springboot

FROM openjdk:8-jdk-alpine
COPY my-api-0.0.1-SNAPSHOT.jar /opt/my-api/my-api.jar
ENTRYPOINT ["/usr/bin/java"]
CMD ["-jar", "/opt/my-api/my-api.jar", "/opt/my-api/public","/opt/my-api/temp", "/opt/my-api/uploads"]
VOLUME ["/opt/my-api/public","/opt/my-api/temp","/opt/my-api/uploads"]
EXPOSE 8080

edit:

nginx - единственная точка входа.все, что входит, должно достигнуть базовой аутентификации.Я не активирую его на http, потому что не хочу допустить эту потенциальную утечку.Но базовая аутентификация не является проблемой, потому что, когда я ее деактивирую, проблема всегда возникает.

Что еще более удивительно, запросы "GET" бэкэнда, которые получают изображения, работают нормально.Фотографии хорошо отображаются.Они работают в разметке и в поле URL браузера.

Но другие запросы GET, которые возвращают zip или другой тип содержимого, не работают.(не работает так хорошо в разметке, как при вводе в браузер).

edit 2:

На самом деле, похоже, работает.Потому что, когда я использую клиент отдыха и запрашиваю свой ресурс на бэкенде, результат хорошо получается.Также, если я вызываю бэкэнд в приложении winthin реагировать на код, результат приходит.

Но когда я вызываю бэкэнд с href, например:

<a 
  href={"https://myPublicHostname/rest/my-api/getZipFile?value=1,2,3,4,5"}
  target="_blank"
>

, тогда бэкэнд не 't получить запрос get.

Итак, некоторые заголовки отсутствуют!?

Ответы [ 2 ]

0 голосов
/ 24 октября 2018

Проблема решена так:

<a 
  href="/rest/photo/getZipFile?value=1,2,3" 
  target="_blank"
  rel="noopener noreferrer"
  download="AnyCustomFileName.zip"
>
    ...button
</a>

Этот простой атрибут, который меняет все:

download = "AnyCustomFileName.zip"

С его помощью браузер добавляет различные заголовки, а затем Nginx добивается его маршрутизации в нужном месте назначения.

Работает для Edge, Chrome, Samsung, Интернета и Firefox ... но Fireforx работает только в частном порядке.сессий.

0 голосов
/ 17 октября 2018
When I query my springboot backend it works fine. The password is asked then when I’m authenticated, I receive the answer.

Если аутентификация включена как в nginx, так и в бэкэнде, то вам потребуется какой-то способ, чтобы nginx мог аутентифицироваться в бэкэнде.

Когда nginx пытается получить доступ к бэкэнду, бэкэнд будет иметь тайм-аут для аутентификации.Возможно, информация аутентификации зашифрована и не может быть удалена.

Сначала проверьте его с аутентификацией только на nginx (с SSL) и включите аутентификацию на бэкенде.

Вы также можете попробовать отключить SSL с nginx на бэкэнд.

Если приведенный выше сценарий не соответствует действительности, а в бэкенде нет аутентификации и SSL, то вот один ответ с проблемой базовой аутентификации SSL nginx:

Базовая аутентификация Nginx работает на http, но не на https

, поэтому сначала нужно убедиться, что nginx настроен на запрос пароля по http и https, а затем выполнить остальную работу.Вы можете просто проверить это сначала на некоторой простой странице.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...