J'essaie d'implémenter un fournisseur d'authentification personnalisé dans Symfony 2. J'envoie une demande de test à l'aide de Fiddler et j'imprime tous les en-têtes côté serveur; eh bien, Authorization
header est manquant.
Est-ce que je fais quelque chose de mal?
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 n'imprime que les en-têtes et quitte:
class HMACListener implements ListenerInterface
{
private $securityContext;
private $authenticationManager;
public function handle(GetResponseEvent $event)
{
$request = $event->getRequest();
print_r($request->headers->all());
die();
}
}
La réponse est manquante 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
)
)
Vous devez ajouter ce code à votre virtualhost
RewriteEngine On
RewriteCond %{HTTP:Authorization} ^(.*)
RewriteRule .* - [e=HTTP_AUTHORIZATION:%1]
Travailler dans la balise Virtualhost, pas dans la balise Directory.
La réponse d'Akambi n'a pas fonctionné pour moi, mais a été trouvée sur le site php:
"Solution de contournement pour l'en-tête d'autorisation manquant sous CGI/FastCGI Apache:
SetEnvIf Authorization .+ HTTP_AUTHORIZATION=$0
Maintenant, PHP devrait automatiquement déclarer les variables $ _SERVER [PHP_AUTH_ *] si le client envoie l'en-tête Authorization. "
Merci derkontrollfreak + 9hy5l!
La solution vérifiée a fonctionné pour moi à l'époque pour obtenir l'en-tête d'autorisation. Cependant, il a généré un en-tête d'autorisation vide lorsqu'il n'y en avait aucun dans la demande entrante. Voici comment je l'ai résolu:
RewriteEngine On
RewriteCond %{HTTP:Authorization} .+
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
J'ai eu le même problème lors de l'écriture d'une API publique avec en-tête Authorization
personnalisé. Pour corriger la HeaderBag
j'ai utilisé un écouteur:
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']);
}
}
}
}
et lié à kernel.request
dans la définition de service:
services:
fix_authentication_header_listener:
class: My\Project\Frontend\EventListener\AuthenticationHeaderListener
tags:
- { name: kernel.event_listener, event: kernel.request, method: onKernelRequest, priority: 255 }
L'en-tête d'autorisation est utilisé pour l'authentification de base http qui est rejetée par Apache si son format n'est pas valide. Essayez d'utiliser un autre nom.
Une autre option qui fonctionnait pour Apache 2.4 alors que les autres options ne fonctionnaient pas consistait à définir l'option CGIPassAuth
dans le contexte <Directory>
approprié, comme suit:
CGIPassAuth On
Selon la documentation, il est disponible depuis Apache 2.4.13.
Nous devrions autoriser cet entête "Autorisation" côté serveur,
c'est aussi tout simplement fait avec 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']
Une autre solution consiste à changer votre gestionnaire PHP
pour qu'il exécute PHP en tant que Apache Module
au lieu de CGI application
.