Externer Login - so einfach...

In diesem Forum können Mod-Autoren ihre Mods vorstellen, die sich noch im Entwicklungsstatus befinden. Der Einbau in Foren im produktiven Betrieb wird nicht empfohlen.
Forumsregeln
phpBB 2.0 hat das Ende seiner Lebenszeit überschritten
phpBB 2.0 wird nicht mehr aktiv unterstützt. Insbesondere werden - auch bei Sicherheitslücken - keine Patches mehr bereitgestellt. Der Einsatz von phpBB 2.0 erfolgt daher auf eigene Gefahr. Wir empfehlen einen Umstieg auf phpBB 3.0, welches aktiv weiterentwickelt wird und für welches regelmäßig Updates zur Verfügung gestellt werden.
wicht
Mitglied
Beiträge: 9
Registriert: 27.09.2004 13:38
Wohnort: Vaihingen an der Enz

Externer Login - so einfach...

Beitrag von wicht »

Hi,

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;
}
Beispielaufruf

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]);
Die Cookie Daten werden bei der aktuellen Version in der 4ten bis 8ten Zeile geschrieben (Index 3 bis 7). Das muß nich auf alle Versionen zutreffen, daher muß man das gegebenenfalls ausprobieren oder man löst das ganze eleganter (hatte ich jetzt keinen Nerv mehr dazu).

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
holunda
Mitglied
Beiträge: 8
Registriert: 27.09.2004 15:04

Beitrag von holunda »

Hi wicht,

Dein Post kam genau zum richtigen Zeitpunkt, danke schonmal.
Irgendwie habe ich was falsch gemacht.

Er setzt mir zwar die richten Cookies und leitet mich auch weiter, wenn ich den $header[8] mit hinein nehme, leider bin ich im Forum aber dann nicht eingeloggt.

Muss man noch irgendwas beachten um richtig eingelogged zu sein?
grüße
Alex
wicht
Mitglied
Beiträge: 9
Registriert: 27.09.2004 13:38
Wohnort: Vaihingen an der Enz

Beitrag von wicht »

Servus,

Theoretisch sollte es ausreichend sein.

Wenn du allerdings einfach nur weiterleiten willst kannst du den kompletten Header übernehmen.

(Also Portal überprüfung machen, wenn ok dann post request und alle headerdaten übernehmen)

Ansonsten könnte es sein das deine Cookies ander verteilt sind, einfach mal ausprobieren den header array auszugeben, dann siehste das ja sofort.

Was auch noch ein möglicher fehler wäre wenn deine Userdaten sonderzeichen enthalten.
Um das zu umgehen solltest du den spaß url-encoden

Code: Alles auswählen

$data = 'username='.urlencode($user).'&password='.urlencode($pw).'&login=true&redirect=../cms/';
Probier mal die erwähnten Dinge. Vielleicht gehts dann.

Und wie gesagt, das zeux sollte auffem gleichen Server liegen, da der Header ja auf dem Server geschrieben wird auf dem die Funktion liegt, somit wird auch der Cookie nur für diesen Server gesetzt.


Gruß,
Wicht
holunda
Mitglied
Beiträge: 8
Registriert: 27.09.2004 15:04

Beitrag von holunda »

Bei folgenden Testaufruf kommen bei meinem Portal Login folgende Daten an:

Aufruf:

Code: Alles auswählen

$data = "username=" . $_POST['user'] . "&password=" . $_POST['pass'] . "&login=Login";
		$header = postRequest('localhost', 80, $cfg['path']['url'] . "forum/data/login.php", $_SERVER['PHP_SELF'], $data, $debug=false);
		print_r($header);

Code: Alles auswählen

[4] => Set-Cookie: phpbb2mysql_data=a%3A0%3A%7B%7D; expires=Wed, 28-Sep-2005 06:33:11 GMT; path=/

    [5] => Set-Cookie: phpbb2mysql_sid=0af93858f20287c6e2131a620f819936; path=/

    [6] => Set-Cookie: phpbb2mysql_data=a%3A2%3A%7Bs%3A11%3A%22autologinid%22%3Bs%3A0%3A%22%22%3Bs%3A6%3A%22userid%22%3Bs%3A1%3A%222%22%3B%7D; expires=Wed, 28-Sep-2005 06:33:11 GMT; path=/

    [7] => Set-Cookie: phpbb2mysql_sid=88787123d3dc33b60f71a3fcf6e8d5bc; path=/

    [8] => Location: http://poseidon/chaos_extranet/forum/data/index.php?sid=88787123d3dc33b60f71a3fcf6e8d5bc
Sollte eigentlich klappen.
Liegt auf gleichem Server
Sonderzeichen sind auch keine vorhanden.

Kann mir das nicht erklären[/quote][/code]
wicht
Mitglied
Beiträge: 9
Registriert: 27.09.2004 13:38
Wohnort: Vaihingen an der Enz

Beitrag von wicht »

$header[3] beinhaltet keine Cookiedaten?

Strange. Was halt denke ich noch gegeben sein muß ist das die funktion in einem verzeichnis das über dem forum verzeichnis liegt ausgeführt wird.
Also in poseidon/chaos_extranet oder darüber da es sonst wiederrum probs mit dem Cookie gibt (gilt ja nur für in "path" angegebenes verzeichnis und alle drunter liegenden => Set-Cookie: phpbb[...]; path=/ )

Ansonsten kann ich mir nicht vorstellen an was es liegt, da du ja ansonsten nix anderes machst als dich normal einzuloggen
holunda
Mitglied
Beiträge: 8
Registriert: 27.09.2004 15:04

Beitrag von holunda »

hmm ist es nicht so dass der path=/ den kompletten Baum (auch unterverzeichnisse) beinhaltet. Dachte ich zumindest immer.

Das komische daran ist, dass ich die Cookies auf der forums index auslesen kann. hmmm mehr macht aber der login check von PHPbb auch nicht ....

irgendwie verzwickt das ganze.
wicht
Mitglied
Beiträge: 9
Registriert: 27.09.2004 13:38
Wohnort: Vaihingen an der Enz

Beitrag von wicht »

/ ist ja nicht der root deines servers sondern das aktuelle verzeichnis.
rufst du die funktion also zB von host/verz/cms auf und das forum liegt in host/verz/forum wird s wohl nicht gehen.

Also ich bin mir ziemlich sicher das hier irgendwo das cookie managment bei dir ne rolle spielt. beim mir funzt es wunderbar.
holunda
Mitglied
Beiträge: 8
Registriert: 27.09.2004 15:04

Beitrag von holunda »

wie gesagt, stuztig macht mich wenn ich das Forum aufrufe mit einem print_r($_COOKIE['phpbb2mysql_sid']); dann gibt er mit die SID aus. ERGO Path des Cookies ist richtig gesetzt und funktioniert auch.

aber nochmal mein aufruf:

root/index.php ruft Function postRequest()
root/forum/data/index.php kann den von index.php gestetzen cookie lesen.

grüße
Alex
wicht
Mitglied
Beiträge: 9
Registriert: 27.09.2004 13:38
Wohnort: Vaihingen an der Enz

Beitrag von wicht »

Was du noch versuchen könntest:

Gib ihm den gesamten header und leite auf keine seite weiter. somit sollte er nen standardlogin machen.

Was sein könnte ist das dein cookie nicht korrekt gelesen wird und er somit die SID brauch, diese aber bei einem späteren aufruf natürlich nicht an der url hängt.
Könntest du testen indem du dich normal im forum einloggst, dann im selben browser auf ne andere seite gehst und dann wieder zum forum gehst ohne die sid mit zu übergeben.

Langsam gehn mir die ideen aus ;)
holunda
Mitglied
Beiträge: 8
Registriert: 27.09.2004 15:04

Beitrag von holunda »

hab ich leider schon ausprobiert.
gesamten Header mitgeben, sprich eigenenm HEADER ("LOCATION: ..) mit der SID angehangen.

funktioniert leider auch nicht.
Das Forum steht da mit der Session ID bin aber nicht eingeloggt.

Nochmal wegen dem Cookie, wie sollte man in dann setzen wenn nicht /.
Da kann ich ja schlecht eingreifen.

Ist dein Portal Forum schon irgendwo online?
Ich stells bei mir mal online ...
Antworten

Zurück zu „phpBB 2.0: Mods in Entwicklung“