2016-11-17 2 views
4

Я использую Nginx (версия 1.9.9) в качестве обратного прокси-сервера для моего внутреннего сервера. Ему необходимо выполнить аутентификацию/авторизацию на основании содержимого запросов POST. И у меня возникли проблемы с чтением тела запроса POST в моем обработчике auth_request. Вот что я получил.Nginx auth_request обработчик доступа к телу запроса POST?

конфигурации Nginx (соответствующая часть):

server { 
    location/{ 
     auth_request /auth-proxy; 
     proxy_pass http://backend/; 
    } 

    location = /auth-proxy { 
     internal; 
     proxy_pass http://auth-server/; 
     proxy_pass_request_body on; 
     proxy_no_cache "1"; 
    } 
} 

И в моем Auth-сервера кода (Python 2.7), я пытаюсь прочитать тело запроса, как это:

class AuthHandler(BaseHTTPServer.BaseHTTPRequestHandler): 
    def get_request_body(self): 
     content_len = int(self.headers.getheader('content-length', 0)) 
     content = self.rfile.read(content_len) 
     return content 

Я распечатанный content_len и он имел правильное значение. Однако self.rfile.read() будет просто зависать. И в итоге он будет тайм-аут и возвращает «[Errno 32] Broken pipe».

Это, как я отправил тестовые данные на сервер:

$ curl --data '12345678' localhost:1234 

Вышеуказанная команда вешает, а также и в конечном счете, время ожидания и печатает «Заключительное соединение 0».

Какие-либо очевидные ошибки в том, что я делаю?

Спасибо большое!

+0

Интересно, что если я использую 'curl' для отправки непосредственно на мой auth-сервер, он может просто прочитать тело запроса. – yty

ответ

5

Код модуля nginx-auth-request-annotated at nginx.com. Модуль всегда заменяет тело POST пустым буфером.

В одном из tutorials, они объясняют причину, заявив:

Поскольку тело запроса отбрасывается для подзапросов аутентификации, вы необходимо установить proxy_pass_request_body директиву кремовый, а также установить Content -Length для нулевой строки

Причина в том, что подзапросы auth отправляются по методам HTTP GET, а не POST. Поскольку GET не имеет тела, тело отбрасывается. Единственным обходным решением с существующим модулем было бы вытащить необходимую информацию из тела запроса и поместить его в HTTP-заголовок, который передается службе auth.

Смежные вопросы