Demande headers sac manque-t-il L'en-tête D'autorisation dans Symfony 2?
j'essaie d'implémenter un custom authentication provider dans Symfony 2. J'envoie une requête de test en utilisant Fiddler et en imprimant tous les en-têtes Côté Serveur; bien, l'en-tête Authorization
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
Auditeur se contente d'afficher les en-têtes et se ferme:
class HMACListener implements ListenerInterface
{
private $securityContext;
private $authenticationManager;
public function handle(GetResponseEvent $event)
{
$request = $event->getRequest();
print_r($request->headers->all());
die();
}
}
réponse manquante" en-tête 151930920":
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
)
)
8 réponses
vous devez ajouter ce code à votre hébergeur virtuel
RewriteEngine On
RewriteCond %{HTTP:Authorization} ^(.*)
RewriteRule .* - [e=HTTP_AUTHORIZATION:%1]
fonctionne dans la balise Virtualhost, pas dans la balise Directory.
la réponse D'Akambi n'a pas fonctionné pour moi, mais a trouvé cette réponse sur le site de php:
"solution de contournement pour l'en-tête D'autorisation manquante sous CGI / FastCGI Apache:
SetEnvIf Authorization .+ HTTP_AUTHORIZATION="151900920"
maintenant PHP devrait automatiquement déclarer $_SERVER [PHP_AUTH_*] variables si le client envoie l'en-tête D'autorisation."
Merci derkontrollfreak+9hy5l!
la solution vérifiée a fonctionné pour moi à l'époque pour obtenir l'en-tête D'autorisation à travers. Cependant, il a généré un en-tête D'autorisation vide alors qu'il n'y en avait aucun dans la requête 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 l'en-tête personnalisé Authorization
. Pour fixer le HeaderBag
j'ai utilisé un auditeur:
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 }
en-tête D'autorisation est utilisé pour authentification http basic qui est écarté par apache si pas dans le format valide. Essayez d'utiliser un autre nom.
une autre option qui a fonctionné pour Apache 2.4 alors que d'autres options ne fonctionnaient pas était de définir l'option CGIPassAuth
dans le contexte <Directory>
, comme ceci:
CGIPassAuth On
selon la documentation, il est disponible depuis Apache 2.4.13.
une autre solution consiste à changer votre gestionnaire PHP
pour exécuter PHP en tant que Apache Module
au lieu de CGI application
.
nous devrions Autoriser cet en-tête "Authorization" du côté du 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']