Andreas Korthaus: HTTP-AUTH logout

Beitrag lesen

Hallo!

Wieso implementieren die Browser eigentlich keine Möglichkeit eines Logouts für HTTP-Auth? Es wäre doch ein leichtes eine Schaltfläche zu schaffen die die Auth-Daten aus dem RAM oder wo auch immer die stehen zu löschen, oder? Noch schöner wäre allerdings ein HTTP-HEader der den Browser dazu veranlassen würde, ist sowas geplant? Ich fänd das gut. Das Problem mit HTTP-Auth ist nämlich, das viele der sog. Entscheidungsträger keine Ahnung haben, aber wissen dass es gut ist wenn man sich aus einer Anwendung ausloggt, so dass wenn man seinen Arbeitsplatz kurz verläßt nicht jeder Zugriff erlangen kann. Und diese Leute glauben man ist blöd wenn man sowas nicht kann sondern sagt man möge doch bitte das Browserfenster schließen - _alle_ Browserfenster. Diese ekeligen Workarounds mit einem nicht vorhandenen Benutzernamen funktionieren sowieso nicht in aktuellen Browsern.
Also suche ich nach einer Alternative, aber ich sehe da wenig Aussicht auf Erfolg. Eine Möglichkeit wäre ja, wenn man aus der Passwortdatei den User kurzfristig entfernt, ich hatte erst dran gedacht in einem anderen Verzeichnis das Login zu machen und wenn jemand sich eingeloggt, diesen User einer temporären Passwortdatei hinzuzufügen, für das eigentliche Verzeichnis der Anwendung, das hat nur den Haken, dass der Login dann nur für das andere Verzeichnis gilt, und der User sich 2 mal einloggen muss, oder man sendet für den 2. Login eine HTML-Seite mit einem Link oder meta-refresh(wobei ich nicht weiß ob das funktionieren würde) um sich dann mit dieser user@pass... Geschichte einzuloggen. Das ist wohl nicht so schön, oder? Zumindest könnte man dann den User auch ausloggen indem man den Eintrag aus der temporären Passortdatei entfernt.

Dann habe ich noch eine Idee, die vielleicht etwas besser ist:
Ich habe nur eine Passwortdatei und ein Verzeichnis, wenn der User sich jetzt auslogt entferne ich diesen aus der Passwortdatei, schicke ihm einen Location-Header so dass der Browser noch einen Request sendet, aber diesmal abgeblockt wird. Das doofe ist jetzt nur, wann füge ich den Benutzer wieder ein, damit er sich dann auch wieder legal einloggen kann? Ich habe dann 1 Script:

logout.php:

fopen("passwortfile");
//entferne Benutzer
fwrite("daten ohne diesen Benutzer");

header('Location: http://www.meinedomain.tld/irgendeinedatei.html');

So, bis dahin kein Problem, aber dann, dann kommt in einer Zeit die ich nicht kenne(da der User ja jetzt nicht mehr zu PHP & Co. durchkommt) der Request der ja scheitern wird. Gibt es irgendeine Möglichkeit mit dem Apachen bei einem 403-Request den originalen Request-String an ein bestimmten PHP-Script zu leiten, obwohl die Authentifizierung aus gutem Grund ja scheitert?
Oder anders herum, wenn der Client den Request sendet der ja "fehlschlagen" wird, dann öffnet sich im Browser das Auth-Fenster. Gibt es eine Möglichkeit, den Client gleichzeitg mit oder am besten anstatt des 403-Header einen entsprechenden Location-Header oder sowas zu schicken, der den Benutzer auf ein frei zugängliches Script sendet, welches die Austragung rückgängig macht? Ich weiß, das ist auch ein Missbrauch von HTTP, aber ginge das nicht vielleicht mit irgendwelchen schmutzigen Tricks(Apache-Modul?)? Problem hierbei ist noch, dass ich die ID des Users brauche, nur woher nehmen? OK, ich könnte in meinem obigen logout.php - Script die UserID mit an den Request-String anhängen, dann käm die ID auf jeden Fall mit zurück zum Apache, dann muss ich sie nur noch auslesen und erneut in einen Location-Header einfügen, nur diesmal an ein frei zugängliches Script. Gibt es da wohl irgendeine Möglichkeit? Könnte ich das vielleicht mit einer Rewrite-Rule machen? Oder wird die HTTP-Authentifizierung grundsätzlich _vor_ den anderen Direktiven in der .htaccess ausgeführt?

Naja, wenn alle Stricke reißen, dann kann ich ja in meinem logout.php-Script eine gewisse Zeit nach senden des Header den Eintrag rückgängig machen.
Ich gehe doch Recht in der Annahme dass sobald ich in PHP einen Location-Header durch Aufruf der Funktion header() sende, der komplette Response-Header sofort gesendet wird, und nicht gewartet wird bis das Script zuende gelaufen ist, oder? Dann könnte ich nämlich nach header() ein sleep(10) einfügen und danach die Änderung rückgängig machen.

Was haltet Ihr davon? Wie würdet Ihr das machen?

Viele Grüße
Andreas