请求标题包缺lessSymfony 2中的授权标头?

我试图在Symfony 2中实现一个自定义的身份validation提供程序 。我使用Fiddler发送一个testing请求,并打印所有头服务器端; 好, 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 ) ) 

您必须将此代码添加到您的虚拟主机

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

在Virtualhost标记中工作,而不是在Directory标记中。

Akambi的答案没有为我工作,但在PHP网站find了这个答案:

“在CGI / FastCGI Apache下缺less授权标头的解决方法:

 SetEnvIf Authorization .+ HTTP_AUTHORIZATION=$0 

现在,PHP应该自动声明$ _SERVER [PHP_AUTH_ *]variables,如果客户端发送授权头。

感谢derkontrollfreak + 9hy5l!

当时validation的解决scheme为我工作,以获得授权标题。 但是,当传入请求中没有任何内容时,它会生成一个空的授权标头。 这是我解决它的方法:

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

编写具有自定义Authorization标头的公共API时遇到同样的问题。 要修复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基本authentication ,如果不是有效格式,则由apache丢弃。 尝试使用另一个名字。

当其他选项不适用于Apache 2.4时,另一个选项是在相关的<Directory>上下文中设置CGIPassAuth选项,如下所示:

 CGIPassAuth On 

根据文档,从Apache 2.4.13开始可用。

另一个解决scheme是更改您的PHP处理程序,以运行PHP作为Apache Module而不是CGI application

你可以使用getallheaders()函数。