Описанный ранее способ использования http-авторизации в Catalyst проектах упорно не хотел работать с FastCGI протоколом. Использовалось:
- Веб-сервер apache версии 2.2.x.
- Модуль подержки протокола FactCGI для веб-сервера apache — mod_fascgi версии 2.4.2. Кстати, mod_fastcgi для apache 2.2 без небольшого патча не собирается. Смотри здесь.
- Движок Catalyst для обработки запросов по протоколу FastCGI — Catalyst::Engine::FastCGI.
В итоге оказалось две причины:
По протоколу CGI http-заголовок Authorization должен передаваться внешнему приложению в качестве одноименной переменной окружения. Почему-то модуль mod_fastcgi по-умолчанию этого не делает, однако предусматривает специальную опцию -pass-header при передаче запроса FastCGI обработчику. Пример использования в файле конфигурации apache — httpd.conf:
FastCgiServer \ /root/MyApp/script/myapp_fastcgi.pl \ -pass-header Authorization
После этого стала доступна переменная окружения Authorization, однако плугин Authentication::Credential::HTTP всё ещё не работал! Дальше пришлось залезть в исходники библиотек Catalyst. Ошибка обнаружилась не в движке Catalyst::Engine::FastCGI, а в его базовом классе Catalyst::Engine::CGI. Из чего с увереностью можно сказать, что и движок Catalyst::Engine::CGI некорректно работает с http-авторизацией. После внесения следующих исправлений всё встало на свои места:
@@ -95,7 +95,7 @@ # Read headers from %ENV while ( my ( $header, $value ) = each %ENV ) { - next unless $header =~ /^(?:HTTP|CONTENT|COOKIE)/i; + next unless $header =~ /^(?:HTTP|CONTENT|COOKIE|Authorization)/i; ( my $field = $header ) =~ s/^HTTPS?_//; $c->req->headers->header( $field => $value ); }
На моё сообщение в список рассылки Catalyst не последовало никакой реакции и ошибка сохраняется до сих пор — версия Catalyst::Runtime 5.7010 на текущий момент.
Комментариев нет:
Отправить комментарий