Andreas Korthaus: PHP, HTTP Cookie vom Client erfragen

Beitrag lesen

Hallo!

Was ist denn z.B. mit dem Auth-Verfahren über Header und error 401?

Ganz einfach:

Client stellt Anfrage
Server antwortet mit 401 und vollständigem Fehlerdokument
(Wenn der Benutzer hier auf Escape drückt, dann wird das Fehlerdokument angezeigt, ansonsten weiter)
Client antwortet mit Benutzernamen und Passwort
Server liefert Seite aus

Du kannst als Server den Client *während* einer Verbindung nicht veranlassen, weitere Header zu senden. Der Client muss immer eine neue Anfrage starten. Ob die jetzt auf dem gleichen Datenkanal passiert (Persisten Connections) oder nicht, ist egal.

Kann denn niemand uns (Andreas, mir) hier zustimmen, der am HTTP-Protokollentwurf beteiligt war? Wenn Du _mir_ schon nicht glaubst, Tom?

Da wird doch auch dreimal hin und her jongliert, obwohl der Körper des HTTP-Dokuments (_nicht_ HTML) noch gar nicht gesendet wurde.

Doch - der wird gesendet!

Du hast mich noch nicht überzeugt.
                ^^^^
                hoffe das wird noch ;-)

ich befürchte nicht ;-)

Aber um bei Deinem jonglierenden Auth-Verfahren zu bleiben, dazu steht folgendes ganz am Anfang des Kapitels im Manual(http://www.php3.de/manual/de/features.http-auth.php):

<quote>
In einem PHP-Skript für ein Apache-Modul kann man die Funktion header() benutzen, um die
Nachricht "Authentifizierung notwendig" an den Client-Browser zu senden, damit dieser ein
Fenster zur Eingabe von Benutzername/Passwort öffnet. Hat der Benutzer diese eingegeben, wird
die URL des PHP-Scripts mit den Variablen $PHP_AUTH_USER, $PHP_AUTH_PW und $PHP_AUTH_TYPE,
die den jeweiligen Benutzernamen, das Passwort und den Typ der Identifizierung enthalten,
erneut aufgerufen.
^^^^^^^^^^^^^^^^^ <= das sind die entscheidenen Worte!
</quote>

Das Beispiel dazu sieht so aus:

<?php
  if(!isset($PHP_AUTH_USER)) {
    Header("WWW-Authenticate: Basic realm="My Realm"");
    Header("HTTP/1.0 401 Unauthorized");
    echo "Text to send if user hits Cancel button\n";
    exit;
  } else {
    echo "Hello $PHP_AUTH_USER.<P>";
    echo "You entered $PHP_AUTH_PW as your password.<P>";
  }
?>

wenn das Script ohne $PHP_AUTH_USER aufgerufen wird, dann wird der entsprechende Header gesendet, der das auth-Fenster beim Client öffnet. Wenn Benutzername eingegeben und auf OK gedrückt wird,  wird der Pfad erneut aufgerufen, mit dem Unterschied dass diesmal $PHP_AUTH_USER gesetzt ist, also reagiert if... anders. Sicher, das steht in _einem_ Scipt, dieses wird aber 2 mal aufgerufen, mit verschiedenen Umgebungsvariablen. Und haargenauso funktioniert das mit den Cookies! Ich hoffe Du glaubst wenigstens dem Manual...
HTTP ist zustandslos, das ist so! Nicht mit TCP/IP verwechseln, da wird "jongliert" aber das ist eine andere Ebene. Zustandslos ist aber für bestimmte Anwendungen - wie eben Authentifizierung - nicht gut, daher wird versucht so gut wie eben möglich mit den gegebenen Beschränkungen des HTTP-Standards ein echtes Login zu emulieren. Aber egal was man macht, es wird nie so sicher sein wie z.B. SSH, denn hier ist man nicht an die Schranken des HTTP-Protokolls gebunden.

Grüße
Andreas

PS: Aber genau das hatte Christian ja bereits geschrieben!