Andreas Korthaus: HTTP-AUTH logout

Beitrag lesen

Hi Cheatah!

weil Browser dazu ungeeignet sind. Es sind die Browser-_Hersteller_, die es implementieren müssten ;-)

OK ;-)

Naja. Mindestens einen Request lang die Zugangsdaten ablehnt. Der Browser wird dann allerdings erneut die Eingabe anbieten, was auch nicht das Gelbe vom Ohr ist.

Ja, aber besser als nichts.

ich hatte erst dran gedacht [...]

Jiautsch. Ganz ehrlich: Finde Dich lieber mit der Nichtexistenz einer vernünftigen Lösung ab. Deine Versuche sind zwar recht weit gedacht, haben aber allesamt ihre Tücken und Fallstricke, die insbesondere an recht freizügiger Implementierungsmöglichkeit bei den Clients hapern. Du kannst hier nicht jede Verhaltensweise existierender und zukünftiger(!) Clients vorhersehen.

Muss ich das denn? HTTP ist "weitgehend" standardisiert implementiert, zumindest wird mir heute und in Zukunft jeder Client der einen 403-HEader bekommt von derselben Recource die er eigentlich im RAM als "Authetifiziert" gespeichert hat, das Login-Fenster öffnen. Das ausloggen klappt also durchaus. Nur muss ich dann dafür sorgen dass der User dann nicht für immer ausgeschlossen ist. Ich habe gerade mal ein bisschen mit dem Apachen rumexperimentiert, meine beiden angedachten Wege kann ich wohl vergessen, der 1. gefällt mir einfach nicht wegen der notwendigen Zwischenseite und dann noch dieser user:pass@ Syntax, dass will ich nicht, und auch dass Passwort im Klartext im Quelltect und damit im Cache des Browsers steht ist schlecht.
Die 2. Version scheitert daran, dass ich gerade einen Denkfehler gemacht habe, der Apache _muss_ ja erst den 403 senden damit es auch funktioniert, und 2 Statuscodes in einem Response, das sind ja gleich 2 Wünsche auf einmal, das wird wohl nicht gehen ;-)

Bliebe da noch die Timeout-Variante:

Dann könnte ich nämlich nach header() ein sleep(10) einfügen und danach die Änderung rückgängig machen.
Jiautsch. Kids, don't do this at home.

Wieso? Was um Himmelswillen soll da probleme bereiten? Von  mir aus setze ich den Timeout auf 60 Sekunden, der Request wird niemals so lange auf sich warten lassen, und wenn doch, dann kann ich den Request ja auf eine spezielle Seite leiten die erklärt dass es nicht funktioniert hat und dass man es nochmal versuchen solte, oder den Browser bitte komplett schließen oder so. Aber dazu wird es mit Sicherheit niemals kommen. Und wenn doch ist es zwar unschön aber sonst nichts.

Ah - neue Idee ;-)

Gruppen! Der Benutzer fliegt einfach aus einer bestimmtem Gruppe. Ah, das ist gut, wie wärs damit:

Jeder User ist in der gruppe "users", und wenn er sich einloggt wird dieser User der gruppe "online" hinzugefügt, die Gruppe "users" darf nur auf ein Script zugreifen, wenn der User sich also einloggt, wird dieses Script aufgerufen welches diesen user der Gruppe "online" hinzufügt, und einen location-header zurückschickt, der zur eigentlichen Startseite, oder der ursprünglich angefragten Recource leitet. Dann ist er "online" und kann tun und lassen was er will. Dann klickt er irgendwann auf logout und das Logout-Script wird aufgerufen, welches ihn aus der Gruppe "online" entfernt, hm, aber jetzt ist er aber noch drin, hm, schlecht :-(

Das Problem bleibt das alte denke ich, oder hat jemand ne Idee wie man diese Gruppen hierfür irgendwie ausnutzen könnt?

Hm, hm, hm, wenn ich doch PHP als Modul verwenden könnte, dann wäre das gar kein Problem, denn dann würde ich hiermit die Authentifizierung machen und hätte etwas andere Möglichkeiten.

Naja, aber so schnell gebe ich nicht auf ;-)

Ich kann ja auch einfach einen 401-Header(sorry, hatte das gerade mit 403 verwechelt) vom PHP-Script senden:

header("WWW-Authenticate: Basic realm="secret"");
header("HTTP/1.0 401 Unauthorized");
exit;

Naja, habe ich zumindest gedacht, aber als Ausgabe bekomme ich einen 500-Stauscode mit folgendem fehler in der Error.log:

malformed header from script. Bad header=HTTP/1.0 401 Unauthorized:

Heißt das httaccess und eine eigene Variante vertragen sich  nicht so? Oder liegts an HTTP1/0?

Ich weiß dass ich nicht _die_ Lösung finden werde, sonst hätt sie jeder, aber ich will einen Logout, und wenn ich dazu meine Timeout Methode verwende - auch gut - wenn ich nichts besseres finde soll es eben so sein ;-)

Ernsthaft, auch wenn es nicht perfekt ist, ist es doch immer noch besser als nichts, oder? Wieso sollte es da Probleme geben?

Ich würde in Bugzilla einen Logout-Button vorschlagen. Wenn in Mozilla sowas implementiert wird, wird sich auch Microsoft in absehbarer Zeit Gedanken darüber machen.

OK, dann sage ich den Leuten "ist in Arbeit, voraussichtlich Juli 2006 wird das in den IE 8.1 implementiert, und wenn Sie dann wie gewohnt 4 Jahre später updaten sollten wir es mit ein bisschen Glück so gegen 2010 verwenden können..." ;-)

Viele Grüße
Andreas