Bearer-Auth hinter Proxys wiederherstellen, die Authorization entfernen
Manche Front-Proxys von Shared-Hosting-Anbietern entfernen den Standard-Header Authorization, bevor die Anfrage PHP erreicht (in Produktion auf Hosting der HETEML-Klasse beobachtet). Eigene Header kommen durch, Authorization nicht — daher scheitern auch die üblichen Rettungstricks:
.htaccessRewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]— nutzlos, Apache sieht den Header nie;CGIPassAuth on— aus demselben Grund.
Die Folge: Jeder Bearer-geschützte Endpunkt antwortet mit 401 missing_token, obwohl der Browser ein vollkommen gültiges Token gesendet hat.
NENE2 liefert eine standardisierte zweiteilige Lösung mit (siehe ADR 0019):
- Frontend:
@hideyukimori/nene2-client(≥ 1.1.0) spiegelt das Token bei jeder Anfrage zusätzlich zum Standard-Header inX-Authorization: Bearer <token>. - Backend:
Nene2\Middleware\AuthorizationHeaderFallbackMiddlewareübernimmt den Spiegel nur, wennAuthorizationfehlt oder leer ist. Hosts, die den Standard-Header durchreichen, bleiben Byte für Byte unberührt.
In der Standard-Pipeline aktivieren
Ein Opt-in-Flag an der RuntimeApplicationFactory:
php
$app = (new RuntimeApplicationFactory(
$psr17, $psr17,
routeRegistrars: [/* ... */],
authMiddleware: $bearerMiddleware,
enableAuthorizationHeaderFallback: true, // standardmäßig aus
))->create();1
2
3
4
5
6
2
3
4
5
6
Aktiviert läuft der Fallback am Anfang der Auth-Stufe — vor der Maschinen-API-Key-Prüfung und vor jeder injizierten Auth-Middleware —, sodass jede Middleware, die Anmeldedaten liest, den wiederhergestellten Header sieht. Er ist methoden- und pfadunabhängig.
Oder manuell verdrahten
In einer selbst zusammengesetzten Pipeline an beliebiger Stelle vor der Auth-Middleware platzieren:
php
$stack = [
// ... Request-ID, Logging, Security-Header, CORS, Fehlerbehandlung ...
new AuthorizationHeaderFallbackMiddleware(),
$bearerMiddleware,
];1
2
3
4
5
2
3
4
5
Außerhalb einer PSR-15-Pipeline steht die Transformation als statischer Helfer bereit:
php
$request = AuthorizationHeaderFallbackMiddleware::apply($request);1
Wann Sie es NICHT aktivieren dürfen
Mit aktiviertem Fallback ist X-Authorization als Anmeldedaten gleichwertig zu Authorization. Das ist genau richtig auf Hosts, die den Header versehentlich entfernen — und genau falsch, wo eine vorgelagerte Instanz ihn absichtlich entfernt:
- ein Gateway, das selbst authentifiziert und eine vertrauenswürdige Identität weiterreicht;
- eine WAF, die eingehende Anmeldedaten nicht vertrauenswürdiger Clients filtert.
In solchen Setups wäre der Spiegel ein vom Client kontrollierter Bypass. Lassen Sie das Flag entweder aus, oder lassen Sie die vorgelagerte Instanz auch X-Authorization entfernen.
Behandeln Sie X-Authorization außerdem in Access-Logs und Zwischen-Proxys mit derselben Vertraulichkeit wie Authorization.
Hinweise
- Der Header-Name ist fest (
AuthorizationHeaderFallbackMiddleware::FALLBACK_HEADER,X-Authorization). Er ist ein flottenweiter Verdrahtungsvertrag mit dem Frontend-Client, kein Einstellknopf. - Der Spiegelwert wird unverändert übernommen (inklusive
Bearer <token>). Die Token-Validierung bleibt vollständig Aufgabe Ihrer Auth-Middleware — ein unbrauchbarer Spiegel scheitert genau wie ein unbrauchbarer Standard-Header. - Die Rangfolge ist immer: Ein nicht leerer
Authorization-Header gewinnt; der Spiegel wird nur herangezogen, wenn der Standard-Header fehlt oder leer ist.