wake-up-neo.com

Header für Anforderungsheader fehlt Autorisierungsheader in Symfony 2?

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
        )
)
42
Polmonino

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.

54

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!

27
matt

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}]
18
mezod

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 }
9

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. 

8
Mun Mun Das

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.

4
likeitlikeit

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

0
ghaliano

Eine andere Lösung ist, Ihren PHP-Handler so zu ändern, dass PHP als Apache Module statt als CGI application ausgeführt wird.

0
Wilt