« TinyMCE für Kommentare yac Demo Chat wieder online »
Warum soll ein Chat keine Authentifizierung machen?
30. September 2008, 22:24
Ich bin gestern gefragt worden: warum macht der yac die Authentifizierung nicht selber? Um diese Frage zu verstehen, erkläre ich erst einmal, wie der Login beim yac funktioniert.
Es fängt alles mit einem einfachen Login-Script an. Ich nehme hier mal ein PHP-Script:
-
$data = get_login_data();
-
$request = "http://" . SERVER . ":" . PORT . "/login?nick=" . $data['nick'] . "&room=" . $data['room'] . "&color=" . $data['color'] . "&right=" . $data['right'] . "&ip=" . $_SERVER['REMOTE_ADDR'] . "&loginkey=" . LOGINKEY;
-
if ($fh)
-
{
-
$buffer = "";
-
}
-
else
Zeile 2: get_login_data() ist hier nur ein Beispiel. Hier soll verdeutlich werden, dass es völlig egal ist, von wo die Daten kommen, wichtig ist nur, dass der Request-String zusammen gebaut werden kann.
Zeile 3: Und genau das passiert hier. Der Request-String enthält alle nötigen Daten wie Nick, Raum, Farbe, Rechte und die IP des Clients.
Zeile 4ff: Nun der fopen() + lesen. Der Chat analysiert nun die Parameter des Request-Strings. Ist die Anfrage gültig, wird die yacsid + ISS erzeugt und diese zusammen mit den anderen Daten temporär gespeichert. Die yacsid und der ISS im Format "yacsid|ISS" wird zurück gegeben und steht im PHP-Script in $buffer zur Verfügung. Ist die Anfrage ungültig (weil die IP von der die Anfrage kommt keine Zugriffserlaubnis hat oder der LOGINKEY ungültig ist) gibt der Chat "ERROR: " + den Grund zurück.
Zeile 11: Prüfen wir noch schnell, ob der Chat einen Fehler gemeldet hat.
Zeile 13: Kein Fehler. Wir splitten die Ausgabe noch in $yacsid und $iss auf.
Bisher haben wir aber noch keinen echten Login, sondern nur die Login-Anfrage. Dies erfolgt mit dem IFrame:
-
<html>
-
<head>
-
<title>yac</title>
-
</head>
-
<frameset rows="*, 50" frameborder="0" framespacing="0">
-
<frame name="output" src="http://<?php echo(SERVER) ?>:<?php echo(PORT) ?>/out?yacsid=<?php echo($yacsid); ?>" scrolling="auto" noresize frameborder="0" framespacing="0">
-
<frame name="input" src="http://<?php echo(URL_ZUR_INPUT_PHP) ?>?yacsid=<?php echo($yacsid); ?>;&iss=<?php echo($iss) ?>" scrolling="no" noresize frameborder="0" framespacing="0">
-
</frameset>
-
</html>
Zeile 6: Hier folgt der Aufruf des Output-Streams des Chats. Genau hier wird von dem Chat die temporär gespeicherte Login-Anfrage zu einem echten Login.
Zeile 7: Hier wird noch eine input.php aufgerufen.
input.php
-
<html>
-
<script language="JavaScript">
-
function clearForm()
-
{
-
document.chatinput.msg.select();
-
document.chatinput.msg.focus();
-
}
-
</script>
-
<form name="chatinput" action="http://<?php echo(SERVER) ?>:<?php echo(PORT); ?>/in" method="get" onSubmit="clearForm()">
-
<input type="hidden" name="yacsid" value="<?php echo($_GET['cookie']); ?>">
-
<input type="hidden" name="iss" value="<?php echo($_GET['iss']); ?>">
-
<input type="text" name="msg" size="100"> <input type="submit" value="Send">
-
</form>
-
</body>
-
</html>
Warum ist dieses Vorgehen nun besser als bei Chats, die den Login selbst durchführen? Nun ja, ob es wirklich besser ist, will ich nicht behaupt, aber ich finde es macht mehr Sinn. Durch dieses Verfahren bleibt es dem Betreiber völlig offen, wie die Authentifizierung aussehen soll. Beispiel: ich habe für meinen Blog das OpenID-Plugin installiert, so dass man sich mit diesem Authentifizieren kann. Würde der yac die Authentifizierung nun selber machen, könnten sich diese User nicht am yac anmelden (btw: ich sollte den Demo Chat mal wieder zum laufen bringen, damit man genau das sehen kann).