webworker :
| 11.07.2003 16:59 |
So, nun einmal an alle die einen "neuen Chat" suchen. Ich habe testweise den GTChat installiert und bin von dem Teil begeistert. Um nun die Userdatenbank "abzugreifen" habe ich eine Implementierungsdoku. Was mir fehlt sind Kenntnisse und schlimmer fast noch ZEIT... Wer kann mir dabei helfen? Vielleicht auch jemand, der eine Chatlösung sucht?
Hier der Integrationsauszug:
Integration von GT-chat in bestehende Strukturen Ich bekomme oft die Frage gestellt, wie man GT-chat mit einer bestehenden Community/Forum/Wasauchimmer (im Folgenden: externes System) zusammenführt, so daß die gleichen Benutzerdaten verwendet werden und ein gemeinsamer Login möglich wird. Die Antwort auf diese Frage ist natürlich stark von dem verwendeten System abhängig und nicht ohne einiges an Programmierkenntnissen umsetzbar. Ich will hier in allgemeiner Form die Änderungen anzeigen, die auf der Seite von GT-chat notwendig sind.
Da die entscheidenden Stellen des Programmtextes seit Version 0.95 offenstehen, könnte man einfach die Benutzer- und Sessionverwaltung (Plugins DataModules/UserModule.pm und DataModules/OnlineModule.pm) austauschen, damit direkt auf die Daten des externen Systems zugegriffen wird. Jedoch ist die Neuprogrammierung dieser Module eine aufwendige und fehlerträchtige Arbeit. Vor allem aber erfordert dieser Ansatz meistens auch Änderungen am externen System, damit dessen Datenbank auch die Daten aufnehmen kann, die nur von GT-chat gebraucht werden.
Im Folgenden wird ein anderer Ansatz vorgestellt, der einen geringeren Programmieraufwand verspricht und meistens keine oder kaum Änderungen des externen Systems erfordert. Dabei behalten sowohl GT-chat als auch das externe System ihre getrennte Benutzer- und Sessionverwaltung bei, diese werden lediglich an entscheidenden Stellen verbunden.
Ich empfehle es, den Links auf die Dokumentation Beachtung zu schenken, da man sonst wichtige Details übersehen könnte. Externer Login Als erstes soll GT-chat die Authentifizierung des Benutzers aus dem externen System übernehmen, damit dieser nicht noch einmal sein Paßwort eingeben muß. Dazu erstellt man ein EnvironmentHandler-Plugin, der ungefähr so aussieht:
sub getEnvironment { my ($self, $main, $environment) = @_;
my $external_user = getExternalLogin(); if (defined($external_user)) { unless ($environment->{has_uncrypted_password}) { $environment->{name} = $external_user->{name}; $environment->{is_username} = 1; $environment->{has_password} = $self; } } else { # Folgende Zeile stellt sicher, daß sich alle # Chat-Besucher vorher beim externen System eingeloggt # haben. Sie kann gelöscht werden, falls das # unnötig ist. $main->fatal_error('nopermission'); } }
sub checkPassword { # Passwortüberprüfung ist schon beim externen System # geschehen, keine zusätzliche Überprüfung hier. return 1; }
Dabei soll die Funktion getExternalLogin() dazu dienen, die Daten des angemeldeten Benutzers beim externen System abfragen. Normalerweise wird das anhand eines Cookie oder einer Session-ID in der URL gemacht. Falls der Chat eine Session-ID in der URL bekommt, sollte man auch dafür sorgen, daß diese weitergegeben wird (siehe $main->{settings}{forward_params}).
Hierdurch werden Benutzername und Paßwort des Benutzers festgelegt, also braucht man ihm eigentlich die Login-Seite gar nicht mehr zu zeigen. Sobald die Verbindungsüberprüfung festgestellt hat, ob sicherer Modus notwendig ist, kann der Benutzer eingeloggt werden. Dazu hängt man bei den Weiterleitungslinks im Template proxycheck_bottom.html noch &action=login an.
Übernahme der Benutzerdaten Es ist relativ kompliziert, zwei Benutzerdatenbanken gleichzeitig zu verwalten. Deswegen ist die Idee hier: der Chat soll die Benutzerdaten erst bekommen, wenn er sie braucht. Dafür stellt GT-chat die UserGenerator-Schnittstelle zur Verfügung. Ein Plugin, das diese Schnittstelle implementiert, kommt zum Einsatz, wenn sich ein Benutzer mit einem nicht existierenden Benutzernamen einzuloggen versucht. Bei Erfolg wird ein neuer Account erzeugt. Für den Fall der Datenübernahme würde das z.B. so aussehen:
sub generateUser { my ($self, $main, $user) = @_;
my $external_user = getExternalUser($user->{name}); if (defined($external_user)) { $external_user->{password} = ''; $external_user->{registration} = $main->{now}; $main->{runtime}{allow_registration} = 1;
return $external_user; } else { return undef; } }
sub cleanUp { # Einmal erstellte Accounts sollen nicht gelöscht werden, # also ist hier nichts zu tun. }
Hier soll die Funktion getExternalUser(username) die Benutzerdaten anhand des angegebenen Namens aus der Benutzerdatenbank des externen Systems laden. Wurde ein Benutzer gefunden, wird ein entsprechender GT-chat-Account erstellt und der Benutzer eingeloggt. Auf die Variable $main->{runtime}{allow_registration} wird später noch eingegangen.
Für einen neuen Benutzer-Account sollten mindestens die Felder name, nick und group gesetzt werden, das Feld email ist empfehlenswert. Das Feld password wird man normalerweise mit einer leeren Zeichenfolge belegen, wodurch das Einloggen in den Account ohne externe Authentifizierung unmöglich wird.
Datenabgleich Es reicht nicht, einen Account zu erstellen, man muß ihn auch auf dem neuesten Stand halten. Haben sich irgendwelche Daten im externen System geändert, müssen sie sich auch im Chat ändern. Eine günstige Stelle für den Datenabgleich ist der Login-Vorgang. Ein LoginChecker-Plugin kann beim Login alle notwendigen Datenfelder ändern, z.B. so:
sub checkLogin { my($self,$main,$user,$room) = @_; my $external_user = getExternalUser($user->{name});
foreach my $key (keys %$external_user) { $user->{$key} = $external_user->{$key}; } }
Hier wird wieder die Funktion getExternalUser(username) benutzt, um die Daten des Benutzers aus dem externen Systems zu laden. Diese werden anschließend in den aktiven Account übertragen.
Überflüssiges entfernen Als letztes hat man noch die Aufgabe, "überflüssige" Funktionalität aus dem Chat zu entfernen. So können z.B. die Profilfelder, die der Chat jetzt mit dem externen System teilt, in beiden Systemen geändert werden. Die vorgestellte Methode zum Datenabgleich impliziert schon, daß diese Möglichkeit beim Chat entfernt wird. Dafür reicht es, die entsprechenden Felder aus dem Template editprofile.html zu entfernen. Eine sichere Sperrung der Änderungen ist nicht notwendig, da die Daten sowieso bei jedem Login überschrieben werden.
Weiterhin will man meistens die komplette Benutzerverwaltung beim externen System lassen, damit werden die Links zur Registrierung und Paßwortwiederherstellung auf der Login-Seite unnötig und können aus dem Template login.html entfernt werden.
Es schadet auch nicht, Registrierungen auf normalen Wege wirklich unmöglich zu machen, da die Entfernung des Links allein keine vollkommene Sicherheit garantiert. Man kann die ProfileChecker-Schnittstelle benutzen, um Registrierungen nur dann zuzulassen, wenn die Variable $main->{runtime}{allow_registration} gesetzt ist (zu beachten: unser UserGenerator-Plugin setzt sie). Die Bezeichnung allow_registration ist dabei frei gewählt worden, sie hat keine besondere Bedeutung für GT-chat. Der Code sähe so aus:
sub checkProfile { my ($self,$main,$user,$olduser) = @_;
if (!defined($olduser) && !$main->{runtime}{allow_registration}) { $main->fatal_error('nopermission'); } }
Dabei ist zu beachten: falls der Gastzugang aktiv bleiben soll, muß auch das Plugin GuestLogin.pm so abgeändert werden, daß es die Variable $main->{runtime}{allow_registration} setzt. Meistens braucht man aber auch den Gastzugang nicht, also deaktiviert man ihn in Settings.dat.
Downloads Hier nochmal alle Code-Ausschnitte als Plugin-Schablone zusammengefaßt: ExternalLink.pm
Beispiel für zusätzliche Eintragungen in Settings.dat zur Aktivierung des Plugins:
{ custom_environment_handlers => ['plugindir::ExternalLink.pm'], custom_user_generators => ['plugindir::ExternalLink.pm'], custom_login_checker => ['plugindir::ExternalLink.pm'],
custom_profile_checker => ['plugindir::ExternalLink.pm'], } |
|
|