Ich versuche, einen benutzerdefinierten Authentifizierungsanbieter in Symfony 2 zu implementieren. Ich sende eine Testanforderung mit Fiddler und drucke alle Header auf der Serverseite. Nun, Authorization
Header 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
Header:
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.
Akambis Antwort funktionierte nicht für mich, fand diese Antwort jedoch auf der PHP-Website:
"Problemumgehung für fehlenden Berechtigungsheader unter CGI/FastCGI Apache:
SetEnvIf Authorization .+ HTTP_AUTHORIZATION=$0
Jetzt sollte PHP automatisch $ _SERVER [PHP_AUTH_ *] - Variablen deklarieren, wenn der Client den Authorization-Header sendet. "
Danke derkontrollfreak + 9hy5l!
Die überprüfte Lösung funktionierte damals für mich, um den Authorization-Header durchzuziehen. Es wurde jedoch ein leerer Berechtigungsheader generiert, wenn in der eingehenden Anforderung keine vorhanden war. So habe ich es gelöst:
RewriteEngine On
RewriteCond %{HTTP:Authorization} .+
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
Ich hatte das gleiche Problem beim Schreiben einer öffentlichen API mit benutzerdefiniertem Authorization
-Header. Um die HeaderBag
zu reparieren, habe ich einen Listener verwendet:
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']);
}
}
}
}
und es an kernel.request
in der Service-Definition gebunden:
services:
fix_authentication_header_listener:
class: My\Project\Frontend\EventListener\AuthenticationHeaderListener
tags:
- { name: kernel.event_listener, event: kernel.request, method: onKernelRequest, priority: 255 }
Der Autorisierungsheader wird für die http-Basisauthentifizierung verwendet, die von Apache verworfen wird, wenn sie nicht im gültigen Format vorliegt. Versuchen Sie es mit einem anderen Namen.
Eine andere Option, die für Apache 2.4 funktionierte, wenn andere Optionen nicht verfügbar waren, war das Setzen der Option CGIPassAuth
im entsprechenden <Directory>
-Kontext wie folgt:
CGIPassAuth On
Laut Dokumentation ist es seit Apache 2.4.13 verfügbar.
Wir sollten diesen Header "Autorisierung" 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']
Eine andere Lösung ist, Ihren PHP
-Handler so zu ändern, dass PHP als Apache Module
statt als CGI application
ausgeführt wird.