Nachdem ich lange gesucht habe und noch länger nix gefunden habe, hab ich mich selbst an das Problem gewagt und das Ergebnis ist recht praktikabel.
Ich poste sie hier da ich denke das dies auch einigen anderen hilft.
Sollte dies nicht der Fall sein könnt ihr diesen Post natürlich auch löschen.
Problemstellung war:
- Es existiert ein Portal / CMS irgendeiner Art.
- Der Login in das Portal soll gleichzeitig einen Login in das Forum bedeuten.
- Es werden verschiedene DB Tabellen für die beiden System benutzt (user stehen in der Tabelle des CMS UND in der Tabelle des Forums
- Die Sync zwischen Forum und CMS DB muß natürlich gegeben sein.
Das Problem war jetzt wie man sich, ohne das man den PhpBB Login nutzt, einloggen kann.
Die Lösung ist so krank wie einfach:
1. Der CMS / Portal Login überprüft die Logindaten des CMS.
2. Sind diese korrekt wird ein Postrequest per Funktion an die login.php des Forums gestellt.
3. Da die Daten ja übereinstimmen (wie gesagt, die Tabellen müßen synchron sein) liefert die login.php die nötigen headerdaten.
4. Aus den Headerdaten wähle ich NUR die Daten die Cookies betreffen und schreibe sie in den Header meiner CMS "Login OK" Seite.
(Wichtig: Es darf natürlich vor dem Header('...'); Statement keine Ausgabe erfolgen.
5. Nun kann ich einfach meine "Login OK" seite ausgeben und bin sowohl im CMS als auch im Forum angemeldet.
Den Post Request mach ich einfach mit der folgenden Funktion:
Code: Alles auswählen
function postRequest($host, $port, $path, $referer, $data, $debug=false) {
// Connect to host
$fp = fsockopen($host, $port) or die("Can't connect to host!");
if ($debug == true) {
printf("Open!\n");
}
// HTTP post request
fwrite($fp, "POST $path HTTP/1.1\r\n");
fwrite($fp, "Host: $host\r\n");
fwrite($fp, "Referer: $referer\r\n");
fwrite($fp, "Content-type: application/x-www-form-urlencoded\r\n");
fwrite($fp, "Content-length: ". strlen($data) ."\r\n");
fwrite($fp, "Connection: close\r\n\n");
fwrite($fp, "$data\r\n");
if ($debug == true) {
printf("Sent!\r\n");
}
// Tests for end-of-file on a file pointer
while(!feof($fp)) {
// Gets line from file pointer
//$res .= fgets($fp, 128);
$res[] = fgets($fp);
}
if ($debug == true) {
printf("Done!\n");
}
// Closes the open file pointer
fclose($fp);
if ($debug == true) {
printf("Close!\n");
}
return $res;
}
Code: Alles auswählen
$data = 'username=wicht&password=wonttellu&login=Login';
$header = postRequest('phpbb.de', 80, '', $_SERVER['PHP_SELF'], $data, $debug=false);
for ($i=3; $i<8; $i++) Header($header[$i]);
Ich schätze das dies allerdings nur funktioniert wenn sich das CMS / Portal auf dem gleichen Server wie das Forum befindet (=> Cookiemanagement) habs aber net getestet.
Ich hoffe ich konnte hier manch einem helfen. Ich hab n paar Stunden gebraucht um eine für mich geeignete Lösung zu finden.
Have fun,
Wicht