Hi!
Vorweg: Dir ist doch hoffentlich klar dass du dir damit ein <I> für einen Tipp&Trick, wenn nicht gar einen Feature-Artikel eingefangen hast? ;-)
Wenn denn am Ende rauskommt dass es so geht wie ich es mir vorstelle, dann gerne(viel fehlt da nicht mehr) ;-)
Ich habe inzwischen noch einige Kleinigkeiten geändert, so dass es auch mit Firebird funktioniert(welcher IMHO an einer weiteren Stelle das HTTP-Protokoll falsch implementiert hat, er versucht jeden Request zuerst ohne Auth-Daten, egal was kommt),
Nein, nicht wirklich. Digest Authentication erfordert sogar Informationen aus einem vorangegangenen 401. Oder habe ich dich jetzt falsch verstanden?
Bei Basic Authentication sollten die Clients, nachdem sie sich eienmalk für ein realm/host authentifiziert haben annehmen, dass sie sich im gesamten Verzeichnis und den Unterverzeichnissen authentifizieren müssen, _ohne erneute Aufforderung_ hierzu. Mozilla 1.3, IE... daie ,machen das auch alle so, nur der Firebird nicht, der sendet niemals 2 Requests mit Auth-Daten hintereinander. Er veruscht es immer erst ohne, wenn ein 401 kommt kommt zwar keine Aufforderung zur Passworteingabe, das macht er dann automatisch nachdem na sich einmal für den realm manuell authentifiziert hat, und eben dieses Verhalten macht das ganez so kompliziert. Man muss erkennen ob es sich bei dem Request um einen manuellen, also nach Eingabe von Authdaten handelt, oder um einen automatischen. Und da reagieren die Browser insgesamt unterschiedlich, und am schlimmsten ist halt der Firebird, da er IMHO das HTTP-Protokoll an den meisten Stellen mißachtet, bzw. geht es dabri nicht um MUSTs sondern um SHOULDs, aber ich sehe keine Grund wieso der Firebird hier den Empfehlungen nicht entspricht. Ich hatte das rein zufällig mal gemerkt als ich neue Statistiken für eien Testseite aufgesetzt hatte und mich dann wunderte, warum ich ungefähr genau so viele 401 Statuscodes habe, wie 200er.
Eines habe ich allerdings noch nicht bedacht, ohne Cookies funktioniert das ganze überhaupt nicht.
Ja, was ich da noch nicht ganz verstehe ist warum du überhaupt HTTP Auth nimmst, wenn du eh Sessions hast?
Das wüßte ich auch gerne ;-)
Es soll halt das bekannte HTTP-Auth Fenster zur Authentifizierung dienen.
Ist es dir wirklich so wichtig dass die Zugangsdaten bei jedem Request im Klartext durch die Leitung rauschen?
Wozu gibt es SSL ;-)
Nochmal zurück zu "ohne Cookies". Das ist wirklich nochmal ne Ecke komplizierter, und am besten macht man das glaube ich wie folgt:
Ich ermitel bevor ich mich überhaupt um Authentifizierung gucker erstmal "Statusvariablen" für die aktuelle Session, und zwar folgende:
$_SESSION['status']['newlogin'] = (0|1)
$_SESSION['status']['relogin'] = (0|1)
$_SESSION['status']['param'] = (html|cookie)
Wie ich die ersten beiden ermittle ist klar(das mache ich ja bereits im Script), den 3. ermittle ich wie folgt:
if (!isset($_REQUEST[session_name()])) {
header('Location: '.$_SERVER['SCRIPT_URI'].'?'.SID.'&'.$_SERVER['QUERY_STRING']);
exit;
}
else if (!isset($_SESSION['status']['param'])) {
if (isset($_COOKIES[session_name()])) {
$_SESSION['status']['param'] = cookie;
}
else {
$_SESSION['status']['param'] = html;
}
}
Jetzt weiß ich vorher was genau es für ein Request ist, das muss ich jetzt "nur noch" einbauen.
Grüße
Andreas