В заголовке запроса отсутствует заголовок авторизации в 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
,