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
        )
)
40
demandé sur Polmonino 2012-08-16 19:16:21

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.

53
répondu Akambi Fagbohoun 2013-06-18 17:31:04

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!

25
répondu matt 2014-11-18 04:04:58

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}]
17
répondu mezod 2015-01-05 19:20:35

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 }
9
répondu Fabian Schmengler 2013-02-01 22:41:17

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.

8
répondu Mun Mun Das 2012-08-16 17:42:27

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.

4
répondu likeitlikeit 2016-07-04 00:14:05

une autre solution consiste à changer votre gestionnaire PHP pour exécuter PHP en tant que Apache Module au lieu de CGI application .

0
répondu Wilt 2015-04-20 12:33:20

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']

0
répondu ghaliano 2018-02-03 12:06:20