LINUX.ORG.RU
решено ФорумAdmin

uwsgi и status 401 unauthorized

 , ,


1

1

Привет ЛОР!

Есть flask-приложение с керберос аутентификацией. Запущенное само по себе (app.run()) оно работает нормально.

Пытаюсь соединить его с nginx через uwsgi (тот, который с pypi).

Руководствовался данной инструкцией.

Без kerberos-аутентификации hello world работает без проблем.

А вот с керберосом начинаются проблемы. Аутентификация происходит следующим образом:

  • При получении запроса flask проверяет поле заголовка Authorization, и, если его нет, отправляет 401 unauthorized с заголовком WWW-Authenticate:"Negotiate".
  • В нормальной ситуации, клиент после этого присылает запрос с полем Authorization и всё ок.

Но при работе через uwsgi после первого ответа 401 соединение закрывается, и как с этим бороться непонятно.

Нагуглил нечто про отсутствующий keep-alive в заголовке при http-auth, но добавление Connection:"keep-alive" в заголовок ответа 401 не помогло.

В выводе uwsgi ничего информативного нет:

[pid: 2528|app: 0|req: 2/4] 192.168.0.76 () {46 vars in 1019 bytes} [Thu Mar 16 18:46:19 2017] GET /hello => generated 12 bytes in 2 msecs (HTTP/1.1 401) 4 headers in 142 bytes (1 switches on core 0).

Дебаг режима у uwsgi походу нет (ну я не нашёл).

Подскажите, что делать, куда копать.

PS: Centos 7 x86_64, python3.4, uwsgi-2.0.14.

★★★★★

Документация говорит, что у uwsgi есть опция http11-socket, которая сама устанавливает Keep-Alive заголовок и выполняет ещё какую-то работу. Попробуй запускать uwsgi с этой опцией.

Дебаг режима у uwsgi походу нет (ну я не нашёл).

Для дебага, наверное, придётся лезть во внутренности или возиться с телнетом.

grazor ★★
()
Ответ на: комментарий от grazor

Документация говорит, что у uwsgi есть опция http11-socket

К сожалению пока не в релизе

Since uWSGI 2.1 (master branch) you can use the http11-socket option.

Но заголовки нужные я и сам могу поставить. Только это не помогает. Сейчас 401 отдаётся таким:

Connection: keep-alive
WWW-Authenticate: Negotiate
Content-Length: 0
Content-Type: text/html; charset=utf-8

Таким его отдаёт flask, таким же получает браузер. По дефолту Content-Length ставится в 12, с ним тоже самое.

Для дебага, наверное, придётся лезть во внутренности или возиться с телнетом.

С телнетом я бы без проблем повозился, но браузер и так всё показывает. uwsgi в наглую закрывает соединение.

Ivan_qrt ★★★★★
() автор топика

Обновился до git-версии, она выдала внятную ошибку. При повторном запросе с полем Authorization размер заголовка был слишком большим. Чуть меньше 12k.

Добавил buffer-size = 16384 в wsgi.ini, проблема решилась.

На 2.0.14 пока ещё не проверял.

Ivan_qrt ★★★★★
() автор топика
Ответ на: комментарий от Ivan_qrt

Ну и в конфиге nginx нужно увеличить

http {
    #client_header_buffer_size           16k;
    large_client_header_buffers         8 16k;

Обязателен только large_client_header_buffers, вторая цифра должна быть больше размера заголовков запроса (> 12k в моём случае).

Ivan_qrt ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.