Anfrage Kopfbeuteltasche fehlt Autorisierungsheader in Symfony 2?

Ich versuche, einen benutzerdefinierten Authentifizierungsanbieter in Symfony 2 zu implementieren. Ich sende eine Testanfrage mit Fiddler und drucke alle Header serverseitig; Nun, Authorization fehlt.

Mache ich etwas falsch?

 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 

Listener druckt nur die Header und beendet:

 class HMACListener implements ListenerInterface { private $securityContext; private $authenticationManager; public function handle(GetResponseEvent $event) { $request = $event->getRequest(); print_r($request->headers->all()); die(); } } 

Antwort fehlt 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 ) ) 

Sie müssen diesen Code Ihrem virtuellen Host hinzufügen

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

Arbeiten Sie im Virtualhost-Tag, nicht im Directory-Tag.

Akambi’s Antwort funktionierte nicht für mich, aber fand diese Antwort auf der php Website:

“Workaround für fehlende Autorisierungsheader unter CGI / FastCGI Apache:

 SetEnvIf Authorization .+ HTTP_AUTHORIZATION=$0 

Nun sollte PHP $ _SERVER [PHP_AUTH_ *] Variablen automatisch deklarieren, wenn der Client den Authorization Header sendet. ”

Danke derkontrollfreak + 9hy5l!

Die verifizierte Lösung funktionierte für mich zu der Zeit, um den Authorization-Header durchzugehen. Es wurde jedoch ein leerer Autorisierungsheader generiert, wenn in der eingehenden Anforderung kein Header vorhanden war. So habe ich es getriggers:

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

Ich hatte das gleiche Problem beim Schreiben einer öffentlichen API mit benutzerdefinierten Authorization . Um den HeaderBag zu reparieren, HeaderBag ich einen Listener benutzt:

 namespace My\Project\Frontend\EventListener; use Symfony\Component\HttpFoundation\HeaderBag; use Symfony\Component\Httpcoreel\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 oncoreelRequest(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']); } } } } 

und gebunden an kernel.request in der Service-Definition:

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

Der Autorisierungsheader wird für die HTTP-Standardauthentifizierung verwendet, die von Apache verworfen wird, wenn sie nicht im gültigen Format ist. Versuchen Sie es mit einem anderen Namen.

Eine andere Option, die für Apache 2.4 funktionierte, als andere Optionen nicht waren, war, die CGIPassAuth Option im relevanten CGIPassAuth wie CGIPassAuth zu setzen:

 CGIPassAuth On 

Laut der Dokumentation ist es seit Apache 2.4.13 verfügbar.

Eine andere Lösung besteht darin, Ihren PHP Handler so zu ändern, dass PHP als Apache Module statt als CGI application .

Wir sollten diesen Header “Authorization” auf der Serverseite autorisieren,

es ist auch einfach mit 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']