Crossdomain-Cookies / Cross-TLD-weite Session

  • Thread starter Thread starter counteam
  • Start date Start date
C

counteam

Guest
Hallöchen :)

Ich bin gerade ein Login-System am basteln. Jetzt stellt sich die Frage (Weil hierbei mehrere Domains bezogen werden sollen), wie ich das ganze Cross-Domain-Fähig bekomme (Ja, es geht sich nicht um Subdomains sondern um verschiedene TLD's).

Meine Idee wäre eigendlich recht simple:
Jede Domain wird nach dem Login Requested, dort die Session-ID übergeben und schwupp, man ist auf Domain1 und Domain2 sowie Domain3 angemeldet.

Leider funktioniert es leider in moment noch nicht.

PHP:
<?php
	
	/*
		Wenn ein Login bereits erfolgt ist und man sich über die anderen Domains Authentifizieren möchte
	*/
	$data_stream = $_GET['session_data'];
	
	if(isset($data_stream) && $data_stream != "") {
	
		// Enthält "referrer" sowie "session" (Session-ID)
		$data = json_decode(base64_decode($data_stream));
		
		if(isset($data) && $data->session != "") {
			/*
				System::getLanguage() definiert die Domain-Endung.
				Bei domain.de wäre dies "de", bei domain.com "com", etc..
			*/
			switch(System::getLanguage()) {
				// Schritt 1: setze session-ID & cookie bei DE-Domain
				case "de":
					print "Login DE";
					session_id($data->session);
					setcookie("PHPSESSID", $data->session, time() + 3600, "/", ".domain." . System::getLanguage());
					
					// Leite zu DOM-Domain weiter um sich dort auch zu Authentifizieren
					header("Location: http://www.domain.com/login.do?session_data=" . base64_encode(json_encode($data)));
				break;
				// Schritt 2: setze session-ID & cookie bei COM-Domain
				case "com":
					print "Login COM";
					session_id($data->session);
					setcookie("PHPSESSID", $data->session, time() + 3600, "/", ".domain." . System::getLanguage());
					
					// Leite zu CH-Domain weiter um sich dort auch zu Authentifizieren
					header("Location: http://www.domain.ch/login.php?session_data=" . base64_encode(json_encode($data)));
				break;
				// Schritt 3: setze session-ID & cookie bei CH-Domain
				case "ch":
					print "Login CH";
					session_id($data->session);
					setcookie("PHPSESSID", $data->session, time() + 3600, "/", ".domain." . System::getLanguage());
					
					// Leite zu AT-Domain weiter um sich dort auch zu Authentifizieren
					header("Location: http://www.domain.at/login.do?session_data=" . base64_encode(json_encode($data)));
				break;
				// Schritt 4: setze session-ID & cookie bei AT-Domain
				case "at":
					print "Login AT";
					session_id($data->session);
					setcookie("PHPSESSID", $data->session, time() + 3600, "/", ".domain." . System::getLanguage());
					
					/*
						So, in allen Systemen authentifiziert..
						Nun gehe endweder zur Hauptseite, oder wenn der Referrer beim Login-Vorgang gesetzt wurde, so gehe dort hin...
					*/
					if(preg_match("/http:\/\/([a-z]+)\.domain\.([a-z]+)(.*)/Uis", $data->referrer)) {
						header("Location: " . $data->referrer);
					} else {
						header("Location: http://www.domain.de/");
					}
				break;
			}
		}
	}
	
	if(isset($_POST['login']) && $_POST['login'] != "") {
		$authentificate = Login::checkData($_POST['nickname'], $_POST['password']);
		if($authentificate >= 1) {
			Login::login($authentificate);
			
			// Register the Session Systemwide
			$data = array(
				"referrer"	=> $_SERVER['HTTP_REFERER'],
				"session"	=> System::session()			// die Aktuelle Session-ID
			);
			header("Location: http://www.domain.de/login.php?session_data=" . base64_encode(json_encode($data)));
		} else {
			// ERROR :: Username/Password ?!
		}
	}

Würde dies funktionieren, was ich da vorhabe?

Achja: Die Cookies werden korrekt gesetzt. Habe es bereits getestet.
 
Last edited by a moderator:
Das Problem ist letztendlich, daß die Browser es nicht zulassen, Cookies für andere Domains zu setzen - du kannst zwar festlegen, daß ein Cookie für die übergeordnete Domain gilt, aber da ist auch bei der 2. Ebene Schluß.
Was geht:
subdomain1.domain.de und subdomain2.domain.de mit setzen von domain.de bei der Cookie-Erstellung (außerdem der Cookie-Pfad auf /, sonst gilt der Cookie nur für bestimmte Unterverzeichnisse).
Was nicht geht, ist z.B. domain1.de und domain2.de oder domain1.com
Du mußt quasi den Browser dazu bewegen, die verschiedenen Domains abzuklappern und dort jeweils die Cookies zu setzen.
 
Was nicht geht, ist z.B. domain1.de und domain2.de oder domain1.com
Du mußt quasi den Browser dazu bewegen, die verschiedenen Domains abzuklappern und dort jeweils die Cookies zu setzen.

Was macht denn bitteschön das Script?
Es redirected zu den anderen Domains wo dort dann die übergebene Session-ID für die jeweilige Domain genutzt wird.
 
Ich hatte mir dein Script nicht groß angesehen, aber grundsätzlich sollte sowas funktionieren. Du hast aber ein großes Problem. Deine Cookies haben eine Gültigkeit von 60 Minuten, d.h. innerhalb dieser 60 Minuten mußt du die Cookies von allen Domains refreshen.
Außerdem verzögerst du den Login, indem du alle Domains einmal abklapperst - ist eine Domain auf Grund eines Fehlers nicht auflösbar, läuft dein Script ins Leere.
Ich würde wahrscheinlich die Authentifizierung über eine Masterdomain machen und dann bei den anderen Domains, sofern keine Session vorhanden ist, einmal kurz bei der Masterdomain vorbei schauen und die Session dort abholen -> also für die einzelnen Domains nur bei Bedarf.
 
Ich hatte mir dein Script nicht groß angesehen, aber grundsätzlich sollte sowas funktionieren. Du hast aber ein großes Problem. Deine Cookies haben eine Gültigkeit von 60 Minuten, d.h. innerhalb dieser 60 Minuten mußt du die Cookies von allen Domains refreshen.
Außerdem verzögerst du den Login, indem du alle Domains einmal abklapperst - ist eine Domain auf Grund eines Fehlers nicht auflösbar, läuft dein Script ins Leere.
Ich würde wahrscheinlich die Authentifizierung über eine Masterdomain machen und dann bei den anderen Domains, sofern keine Session vorhanden ist, einmal kurz bei der Masterdomain vorbei schauen und die Session dort abholen -> also für die einzelnen Domains nur bei Bedarf.

Ja, hat schon vor und nachteile...
die Zeit kann ja erhöht werden, ob es nun 60 Minuten oder 5 Jahre ist - Spielt doch keine rolle ^^

Wegen deiner Idee mit der Masterdomain: Naja man könnte dies ja mit dem anderen verbinden ;)
 
Ich würde es so lösen:

domain.com -> domain.com
domain.de -> de.domain.com
domain.ch -> ch.domain.com
 
Back
Top