Der Authorization-Header kommt bei PHP nicht an
- Matt
Die PHP-API von DropicIsland arbeitet mit Bearer-Token. Lokal im Docker-Container liefen alle Tests, auf dem Strato-Webspace scheiterte jeder angemeldete Aufruf mit „No token provided“. Der Header war im Browser eindeutig gesetzt.
Der Unterschied: Lokal lief PHP als Apache-Modul, bei Strato als CGI. Und Apache gibt den Authorization-Header an CGI-Programme aus Sicherheitsgründen standardmäßig nicht weiter. getallheaders() sieht ihn dann schlicht nicht.
Die Lösung in der .htaccess legt den Header in eine Umgebungsvariable:
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
Im PHP-Code liest man dann zuerst $_SERVER['HTTP_AUTHORIZATION'] und, falls eine Umleitung dazwischen lag, $_SERVER['REDIRECT_HTTP_AUTHORIZATION'], erst danach getallheaders().
Eleganter wäre die Apache-Direktive CGIPassAuth On. Die habe ich bewusst nicht genommen, weil sie in der .htaccess nur erlaubt ist, wenn der Hoster AllowOverride AuthConfig zulässt, und sonst ein 500er droht. Der Haken: So ein Fehler fällt in keinem lokalen Test auf. Seitdem schickt der Deploy einen Testaufruf mit einem ungültigen Token und erwartet „Invalid token“ statt „No token“. Dokumentiert ist das Verhalten bei CGIPassAuth. Andere Strato-Eigenheiten hatte ich beim Cron-Job für Jekyll gesammelt.