В заголовке запроса отсутствует заголовок авторизации в Symfony 2?

Я пытаюсь реализовать пользовательский поставщик аутентификации в Symfony 2. Я отправляю тестовый запрос с использованием Fiddler и печатаю все заголовки на стороне сервера; Что ж, Authorization заголовок отсутствует.

Я делаю что-то неправильно?

GET /RESTfulBackend/web/index.php HTTP/1.1
Authorization: FID 44CF9590006BF252F707:jZNOcbfWmD/
Host: localhost
User-Agent: Fiddler
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: it-it,it;q=0.8,en-us;q=0.5,en;q=0.3

Слушатель просто печатает заголовки и выходит:

class HMACListener implements ListenerInterface
{
    private $securityContext;

    private $authenticationManager;

    public function handle(GetResponseEvent $event)
    {
        $request = $event->getRequest();
        print_r($request->headers->all()); 
        die();
     }
}

Ответ отсутствует Authorization заголовок:

Array
(
    [host] => Array
        (
            [0] => localhost
        )
    [user-agent] => Array
        (
            [0] => Fiddler
        )
    [accept] => Array
        (
            [0] => text/html,application/xhtml+xml,application/xml
        )
    [accept-language] => Array
        (
            [0] => it-it,it;q=0.8,en-us;q=0.5,en;q=0.3
        )
)

9 ответов

Вы должны добавить этот код на ваш виртуальный хост

    RewriteEngine On
    RewriteCond %{HTTP:Authorization} ^(.*)
    RewriteRule .* - [e=HTTP_AUTHORIZATION:%1]

Работайте в теге Virtualhost, а не в теге Directory.

Ответ Акамби у меня не сработал, но нашел этот ответ на сайте php:

"Обходной путь для отсутствия заголовка авторизации в CGI/FastCGI Apache:

SetEnvIf Authorization .+ HTTP_AUTHORIZATION=$0

Теперь PHP должен автоматически объявлять переменные $_SERVER[PHP_AUTH_*], если клиент отправляет заголовок авторизации."

Спасибо derkontrollfreak+9hy5л!

Проверенное решение работало для меня в то время, чтобы получить заголовок авторизации. Однако он генерировал пустой заголовок авторизации, когда во входящем запросе его не было. Вот как я это решил:

RewriteEngine On
RewriteCond %{HTTP:Authorization} .+
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

У меня была такая же проблема при написании публичного API с кастомным Authorization заголовок. Чтобы исправить HeaderBag Я использовал слушателя:

namespace My\Project\Frontend\EventListener;

use Symfony\Component\HttpFoundation\HeaderBag;

use Symfony\Component\HttpKernel\Event\GetResponseEvent;

/**
 * Listener for the REQUEST event. Patches the HeaderBag because the
 * "Authorization" header is not included in $_SERVER
 */
class AuthenticationHeaderListener
{
    /**
     * Handles REQUEST event
     *
     * @param GetResponseEvent $event the event
     */
    public function onKernelRequest(GetResponseEvent $event)
    {
        $this->fixAuthHeader($event->getRequest()->headers);
    }
    /**
     * PHP does not include HTTP_AUTHORIZATION in the $_SERVER array, so this header is missing.
     * We retrieve it from apache_request_headers()
     *
     * @param HeaderBag $headers
     */
    protected function fixAuthHeader(HeaderBag $headers)
    {
        if (!$headers->has('Authorization') && function_exists('apache_request_headers')) {
            $all = apache_request_headers();
            if (isset($all['Authorization'])) {
                $headers->set('Authorization', $all['Authorization']);
            }
        }
    }
}

и привязал его к kernel.request в определении сервиса:

services:
  fix_authentication_header_listener:
    class: My\Project\Frontend\EventListener\AuthenticationHeaderListener
    tags:
      - { name: kernel.event_listener, event: kernel.request, method: onKernelRequest, priority: 255 }

Заголовок авторизации используется для базовой аутентификации http, которая удаляется apache, если она не в допустимом формате. Попробуйте использовать другое имя.

Another option that worked for Apache 2.4 when other options did not was to set the CGIPassAuth вариант в соответствующем <Directory> контекст, как это:

CGIPassAuth On

According to the documentation, it is available since Apache 2.4.13.

Если вы используете apache и у вас уже есть переопределение заголовка в вашем файле .htaccess, но вы все равно получаете ошибку 401

      RewriteCond %{HTTP:Authorization} .+
RewriteRule ^ - [E=HTTP_AUTHORIZATION:%0]

Затем убедитесь, что вы включили переопределение конфигурации в своемVirtualHost. Установите значение наAllдляAllowOverrideпараметр вDirectoryярлык

      <VirtualHost *:80>
    ...
    <Directory /var/www/***>
        AllowOverride All
        ...
    </Directory> 

</VirtualHost> 

Не забудьте перезапустить apache после внесения изменений

Мы должны авторизовать этот заголовок "Авторизация" на стороне сервера,

это также просто сделано с nelmioCorsBundle nelmio_cors: defaults: allow_credentials: false allow_origin: [] allow_headers: [] allow_methods: [] expose_headers: [] max_age: 0 hosts: [] origin_regex: false forced_allow_origin_value: ~ paths: '^/api/': allow_origin: ['*'] allow_headers: ['Authorization']

Другое решение состоит в том, чтобы изменить свой PHP обработчик для запуска PHP как Apache Module а не как CGI application,

Другие вопросы по тегам