session OHNE $user-objekt auslesen

In diesem Forum kann man Fragen zur Programmierung stellen, die bei der Entwicklung von Mods für phpBB 3.0.x oder dem Modifizieren des eigenen Forums auftauchen.
Forumsregeln
phpBB 3.0 hat das Ende seiner Lebenszeit überschritten
phpBB 3.0 wird nicht mehr aktiv unterstützt. Insbesondere werden - auch bei Sicherheitslücken - keine Patches mehr bereitgestellt. Der Einsatz von phpBB 3.0 erfolgt daher auf eigene Gefahr. Wir empfehlen einen Umstieg auf die neuste phpBB-Version, welches aktiv weiterentwickelt wird und für welches regelmäßig Updates zur Verfügung gestellt werden.
Antworten
combuster
Mitglied
Beiträge: 88
Registriert: 31.12.2007 01:47

session OHNE $user-objekt auslesen

Beitrag von combuster »

Hi!

Für eine Website versuche ich einen phpbb3 adapter zu schreiben. Ich möchte, dass ein User, der sich im Forum eingeloggt hat auch auf der Website eingeloggt ist. Aus kollisions Gründen (z.B. globale Variablen des phpBB3 ) ist es NICHT möglich, das über die normale phpbb3-standard lösung mit common.php und $user->session_begin() zu machen. (Also weder "Vorlage für in phpBB3 eingebundene Seiten" noch "Authentication Plugins" helfen mir hier - es seidenn jemand kennt eine Möglichkeit, wie ich innerhalb einer php-function das ganze serielle phpbb3-script fürs session-managment ohne Kollisionen mit dem anderen Framework abhandeln kann - quasi eine Sandbox in der das phpbb3-script läuft?..).

Die cookies sind kein Problem:

Code: Alles auswählen

	/**
	 * reads client cookies of the phpBB3
	 *
	 * @param string $phpbbCookieName
	 * @return array - phpbb3-cookies with sessionKey, user_id and sessionId
	 */
	private static function readCookies($phpbbCookieName)
	{
		$sessionKey = sfContext::getInstance()->getRequest()->getCookie($phpbbCookieName.'_k');
		$user_id = sfContext::getInstance()->getRequest()->getCookie($phpbbCookieName.'_u');
		$sessionId = sfContext::getInstance()->getRequest()->getCookie($phpbbCookieName.'_sid');
		$cookies = array('sessionKey' => $sessionKey,
						'user_id' => $user_id,
						'sessionId' => $sessionId,
		);
		return $cookies;
	}
damit komm ich dann an die session und user_id.
Das funktioniert allerdings nur, wenn der User "automtisch anmelden" beim einloggen markiert und natürlich cookies unterstützt.

Ich möchte nun die session auch bekommen, ohne dass der user diese option markiert haben muss. (Also für einen Login ohne "Mich bei jedem Besuch automatisch anmelden").

Was ich im phpbb3-Code gefunden habe und versucht habe zu adaptieren, hat leider nicht geklappt.
Ich brauche eigentlich nur die user_id oder session_id, um den user zu identifizieren. Den Rest bekomme ich aus der Datenbank.

Jetzt ist die große frage, wie komme ich an die session vom phppbb OHNE phpbb Funktionen inkludieren zu müssen?

Das ist glaube ich der relevante Code-Teil vom phpBB3:

Code: Alles auswählen

function session_begin($update_session_page = true)
{
	global $phpEx, $SID, $_SID, $_EXTRA_URL, $db, $config, $phpbb_root_path;
//...
		if (isset($_COOKIE[$config['cookie_name'] . '_sid']) || isset($_COOKIE[$config['cookie_name'] . '_u']))
		{
			//...
		}
		else
		{
			$this->session_id = $_SID = request_var('sid', '');
			$SID = '?sid=' . $this->session_id;
		}
		//...
}
Ich habe versucht die request_var function zu verkürzen auf das was ich daraus brauche und mit dieser dann an die sid zu kommen. Leider hat das nicht geklappt und die sid ist immer leer.

Was brauche ich noch um an die sid zu kommen?
Benutzeravatar
gn#36
Ehrenadmin
Beiträge: 9313
Registriert: 01.10.2006 16:20
Wohnort: Ganz in der Nähe...
Kontaktdaten:

Re: session OHNE $user-objekt auslesen

Beitrag von gn#36 »

Ist zwar ne banale Frage, aber: Hast du denn überhaupt $config mit den entsprechenden Daten gefüllt? Sonst stimmen die ausgelesenen Cookienamen ja nicht. Grundsätzlich ist die Stelle schon richtig, der Cookie mit der Session ID trägt den Namen $config['cookie_name'] . '_sid' (ausgewertet natürlich).
Begegnungen mit dem Chaos sind fast unvermeidlich, Aber nicht katastrophal, solange man den Durchblick behält.
Übertreiben sollte man's im Forum aber nicht mit dem Chaos, denn da sollen ja andere durchblicken und nicht nur man selbst.
combuster
Mitglied
Beiträge: 88
Registriert: 31.12.2007 01:47

Re: session OHNE $user-objekt auslesen

Beitrag von combuster »

Hi, also die config-sachen habe ich kopiert und das Forum an sich läuft schon länger einwandfreit. Die Cookies kann ich lesen - das funktioniert solange man die option "autmatisch einloggen" aktiviert.

1) Das Ganze cookie-lesen funktioniert nur solange die Option "autmatisch anmelden" markiert ist. Wenn sie nicht markiert ist, wird die session dann überhaupt ins cookie gelegt? Oder sind die cookie-namen unterschiedlich jenachdem ob man "automatisch einloggen" aktiviert hat oder nicht?

2) Ich möchte jetzt noch den alternativen Weg OHNE cookies auch haben, falls der User keine Cookies aktiviert hat.
//EDIT oder beziehst du dich auf das zitat aus der session_begin? den cookie teil daraus brauche ich ja nicht. Das hab ich drin gelassen, um klar zu machen, welchen else-Teil ich meine. Wenn ich die option "automatisch einloggen" nicht aktiviert habe, dann schafft es das phpbb ja trotzdem, mich richtig zu authentifizieren für die session. Und genau an diese Session komme ich scheinbar nicht über cookies dran :-/
Zuletzt geändert von combuster am 01.05.2010 00:17, insgesamt 1-mal geändert.
Benutzeravatar
gn#36
Ehrenadmin
Beiträge: 9313
Registriert: 01.10.2006 16:20
Wohnort: Ganz in der Nähe...
Kontaktdaten:

Re: session OHNE $user-objekt auslesen

Beitrag von gn#36 »

Ach so, wenn keine Cookies erlaubt sind, dann liegt die Session ID ganz einfach in der Variablen sid in $_GET oder $_POST (je nach dem ob du gerade ein Formular absendest oder einen Link geklickt hast).
Begegnungen mit dem Chaos sind fast unvermeidlich, Aber nicht katastrophal, solange man den Durchblick behält.
Übertreiben sollte man's im Forum aber nicht mit dem Chaos, denn da sollen ja andere durchblicken und nicht nur man selbst.
combuster
Mitglied
Beiträge: 88
Registriert: 31.12.2007 01:47

Re: session OHNE $user-objekt auslesen

Beitrag von combuster »

danke soweit.

Hab meinen Beitrag oben nochmal neu formuliert, um mich klarer auszudrücken... in der Zeit hattest du schon geantwortet :-)


Die sid ist weder in var_dump($_GET) noch in var_dump($_POST) zu sehen. Das liegt wahrscheinlich daran, dass man nicht über einen Link aus dem Forum auf die Website kommt. (gewolltes Szenario: User geht auf website.de, will was machen -> meldung "zuerst einloggen" (link auf phpbb3 login unter forum.website.de). User loggt sich im Forum ein. Nun soll die Website den user als eingeloggt erkennen.)
Da das nicht ganz ungefährlich ist und auch technisch afaik recht aufwändig ist, ist das Szenario kein MUSS. Gehen wir also davon aus, dass cookies unterstützt werden.

Für alle Aktionen, die darauf zurückgreifen würden, braucht die Website selbst sowieso cookies.
Wichtiger wäre mir daher, dass auch ohne "automatisch einloggen" der Weg über die cookies funktioniert, wie im letzten Post nochmal geschrieben:
Das Ganze cookie-lesen funktioniert nur solange die Option "autmatisch anmelden" markiert ist. Wenn sie nicht markiert ist, wird die session dann überhaupt ins cookie gelegt? Oder sind die cookie-namen unterschiedlich jenachdem ob man "automatisch einloggen" aktiviert hat oder nicht?
Ich glaube nicht, weil die sid dann überall dran hängt und bei nem login mit "automatisch einloggen" nicht.. wie zwingt man das phpbb3 dazu, immer cookies zu verwenden?
Benutzeravatar
gn#36
Ehrenadmin
Beiträge: 9313
Registriert: 01.10.2006 16:20
Wohnort: Ganz in der Nähe...
Kontaktdaten:

Re: session OHNE $user-objekt auslesen

Beitrag von gn#36 »

Ok, klar, die SID wird natürlich nur bei foreninternen Links angehängt wenn keine Cookies möglich sind (um das zu testen ist nach dem Login grundsätzlich erst mal die SID angehängt und wird danach weggelassen wenn Cookies möglich sind), nicht jedoch bei "externen" Links, auch wenn sie auf der gleichen Website bleiben.

Eigentlich unterscheiden sich die Cookies aber nicht grundsätzlich. Auf Userseite unterscheidet sich lediglich das Ablaufdatum und der Inhalt von ..._k - beim Dauerlogin ist dort ein hash drin, beim Kurzzeitlogin ist er leer. _u und _sid unterscheiden sich nicht. Wenn der Cookie schon da ist wäre mir nicht ganz klar, warum es nicht unabhängig davon funktionieren soll ob es sich um einen dauerhaften oder kurzzeitigen Login handelt - abgesehen davon dass man den Cookie aufgrund der kurzen Lebensdauer besser ständig erneuern sollte.
Begegnungen mit dem Chaos sind fast unvermeidlich, Aber nicht katastrophal, solange man den Durchblick behält.
Übertreiben sollte man's im Forum aber nicht mit dem Chaos, denn da sollen ja andere durchblicken und nicht nur man selbst.
combuster
Mitglied
Beiträge: 88
Registriert: 31.12.2007 01:47

Re: session OHNE $user-objekt auslesen

Beitrag von combuster »

ok, danke, mir war nicht klar, dass lediglich das _k-cookie anders ausfällt. Jetzt ist klar, dass der session_key nur für lang-zeit-sessions benötigt wird, um den user zu identifizieren, während _u und _sid die aktuelle session beinhalten und nach nem timeout ablaufen.

D.h. es reicht wenn ich

1. _sid und _u in der db suche. Wenn die passen, ist der User eingeloggt.
2. Wenn nicht, prüfe ich das _k-cookie (und könnte eine neue session für den user in der session-tabelle anlegen).

Dabei könnte ich dann noch bei jeder Aktion auf meiner Seite die session-table ubdaten, damit die session nicht gelöscht wird. Muss ich dabei am Cookie auch was ändern?

Danke!
comb
Benutzeravatar
gn#36
Ehrenadmin
Beiträge: 9313
Registriert: 01.10.2006 16:20
Wohnort: Ganz in der Nähe...
Kontaktdaten:

Re: session OHNE $user-objekt auslesen

Beitrag von gn#36 »

Wenn du dir die Cookies ansiehst stellst du fest, dass der Session Cookie beim kurzfristigen Login relativ schnell abläuft. Du solltest den Cookie daher erneuern.
Begegnungen mit dem Chaos sind fast unvermeidlich, Aber nicht katastrophal, solange man den Durchblick behält.
Übertreiben sollte man's im Forum aber nicht mit dem Chaos, denn da sollen ja andere durchblicken und nicht nur man selbst.
combuster
Mitglied
Beiträge: 88
Registriert: 31.12.2007 01:47

Re: session OHNE $user-objekt auslesen

Beitrag von combuster »

Danke!
Antworten

Zurück zu „[3.0.x] Mod Bastelstube“