Загрузка шаблона Nifi отвечает 403 ошибкой + браузер регистрирует неверный запрос CORS - PullRequest
1 голос
/ 22 октября 2019

Я установил экспериментальную песочницу с простым сервисом Nifi 1.9.2 за обратной HAProxy 1.8. Все работает как положено, кроме функции загрузки шаблонов. В настоящее время я не использую никакой формы аутентификации или сертификатов (это песочница)

Прокси-сервер, настроенный в HAProxy, был прост:

backend service-nifi
    # I think this first line is the issue
    http-request set-header Origin http://127.0.0.1:8080
    http-request add-header X-ProxyPort 80
    http-request add-header X-ProxyScheme http
    http-request add-header X-ProxyHost experimental
    server nifi-server 127.0.0.1:8080 check

Соответствующая часть свойств Nifi выглядит следующим образом:

# web properties #
nifi.web.war.directory=./lib
nifi.web.http.host=127.0.0.1
nifi.web.http.port=8080
nifi.web.http.network.interface.default=
nifi.web.https.host=
nifi.web.https.port=
nifi.web.https.network.interface.default=
nifi.web.jetty.working.directory=./work/jetty
nifi.web.jetty.threads=200
nifi.web.max.header.size=16 KB
# whatever I put next breaks my current setup. I don't understand why yet
nifi.web.proxy.context.path=
nifi.web.proxy.host=

Везде, где я ищу решение для недействительного запроса, ответ всегда один и тот же: в текущей версии Nifi есть фильтрация CORS, и я должен установить заголовок Origin на то, что Nifiожидает, что это будет. Я бы предположил, что это должно быть следующим (как показано в строке set-header):

  • схема: http
  • хост: 127.0.0.1
  • порт: 8080

Я уже подтвердил с помощью tcpdump, что запрос пересылается, как предполагалось: sudo tcpdump -s 1024 -l -A -i lo 'tcp port 8080' > dump

Вот мой запрос:

21:31:43 IP localhost.38642 > localhost.http-alt: Flags [P.], seq ..., ack ..., win ..., options [...], length ...: HTTP: POST /nifi-api/process-groups/{id}/templates/upload HTTP/1.1
...
POST /nifi-api/process-groups/{id}/templates/upload HTTP/1.1
Host: experimental
User-Agent: Mozilla... Firefox...
Accept: application/xml, text/xml, */*; q=0.01
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
X-Requested-With: XMLHttpRequest
Content-Type: multipart/form-data; boundary=---------------------------1434591419995738407236256922
Content-Length: 10378
Referer: http://experimental/nifi/
Origin: http://127.0.0.1:8080
X-ProxyPort: 80
X-ProxyScheme: http
X-ProxyHost: experimental

Это ответ:

21:31:43 IP localhost.http-alt > localhost.38642: Flags [P.], seq ..., ack ..., win ..., options [...], length ...: HTTP: HTTP/1.1 403 Forbidden
...
HTTP/1.1 403 Forbidden
Date: Mon, 21 Oct 2019 21:31:43 GMT
X-Frame-Options: SAMEORIGIN
Content-Security-Policy: frame-ancestors 'self'
X-XSS-Protection: 1; mode=block
Content-Length: 20
Server: Jetty(9.4.11.v20180605)

Invalid CORS request

Я знаю из хранилища , что POST не входит в число принятых методов для конечной точки /process-groups/*/templates/upload.

Я также попытался повысить уровень регистрации всего, настроив файл conf/logback.xml, чтобы помочь устранить неполадки, но вывод подавляющим и в основном шум.

Я довольно разочарован этой проблемой. Я прочитал много тем об этой проблеме, и я попробовал почти все под солнцем. Многие примеры используют NginX или Apache. У меня нет такой гибкости, но я считаю, что HAProxy более чем достаточно. Лучше всего, что есть что-то, чего я не вижу, или что я полностью проигнорировал.

1 Ответ

2 голосов
/ 22 октября 2019

Если вы посмотрите на свой запрос, это означает, что на вас ссылается http://experimental/nifi/, тогда как источник - http://127.0.0.1:8080.

Если вы измените первую строку, вы по праву подозреваете, что проблемана http://experimental, тогда сообщение должно пройти успешно.

В качестве альтернативы, не очень правильный хакерский метод мог бы добавить заголовок Access-Control-Allow-Origin со значением http://127.0.0.1:8080.

...