2010-11-03 6 views
9

Ich habe eine Haupt domain: main.com, Subdomänen: test1.main.com, test2.main.com und andere Domänen one.com, two.com.PHP-Authentifizierung mit mehreren Domänen und Subdomänen

Jetzt ist es wie diese getan:

ini_set("session.cookie_domain", ".main.com"); 

$domain = 'main.com'; 

login.php

$user = $db->query("SELECT id, login FROM users WHERE email=? AND password=?", 
array($email, $password), "rowassoc"); 

if($user) 
{ 
    $_SESSION['user_id'] = $user['id']; 
    $_SESSION['user_name'] = $user['login']; 

    $time = 100000; 

    setcookie('email', $email, time() + $time, "/", "." . $domain); 
    setcookie('password', $password, time() + $time, "/", "." . $domain); 

    header('Location: http://' . $user['login'] . "." . $domain); 
    exit; 
} 

auf jeder Seite hinzugefügt:

if(!isset($_SESSION['user_id'])) 
{ 
    if(isset($_COOKIE['email']) && isset($_COOKIE['password'])) 
    { 
    $email = $_COOKIE['email']; 
    $password = $_COOKIE['password']; 

    $user = $db->query("SELECT id, login FROM users WHERE email=? AND password=?", 
    array($email, $password), "rowassoc"); 

    if($user) 
    { 
     $_SESSION['user_id'] = $user['id']; 
     $_SESSION['user_name'] = $user['login']; 
    } 
    } 
} 
else 
{ 
    $user = $db->query("SELECT id, login FROM users WHERE id=?", 
    array($_SESSION['user_id']), "rowassoc"); 


    if(!$user) 
    { 
    setcookie('email', '', time() , "/", "." . $domain); 
    setcookie('password', '', time() , "/", "." . $domain); 
    unset($_SESSION['user_id']); 

    session_destroy(); 
    setcookie("PHPSESSID","",time(), "/", "." . $domain); 
    } 
    else 
    { 
    $_SESSION['user_id'] = $user['id']; 
    $_SESSION['user_name'] = $user['login']; 
    } 
} 

logout.php

if(isset($_SESSION['user_id'])) 
{ 
    setcookie('email', '', time() , "/", "." . $domain); 
    setcookie('password', '', time() , "/", "." . $domain); 
    unset($_SESSION['user_id']); 
    unset($_SESSION['user_name']); 

    session_destroy(); 
    setcookie("PHPSESSID","",time(), "/", "." . $domain); 

    header('Location: /main'); 
    exit; 
} 

Aber es funktioniert nur auf Domäne main.com und seine Subdomänen test1.main.com, test2.main.com.

Ich muss irgendwie die Sitzung und auf anderen Domänen one.com, two.com speichern.

Wie am besten sichere Authentifizierung zu tun, wenn es Lösungen gibt, ich wirklich verwirrt, bitte erzählen Sie mit Beispiel.

+0

Wir brauchen ** Weg ** mehr Details zu dem, was Sie erreichen möchten. Was hat die Authentifizierung mit den verschiedenen Domains zu tun? Bitte bearbeiten Sie Ihre Frage, um weitere Details hinzuzufügen. – webbiedave

+0

Es tut mir leid. Ode hinzugefügt. – swamprunner7

+0

Duplikat von http://stackoverflow.com/questions/244008/how-doi-i-maintain-php-sessions-across-multiple-domains-on-the-same-server – Brad

Antwort

9

Soweit ich weiß, ist es gut, Sitzungen zwischen Subdomains zu kreuzen, aber es wird nicht auf eine ganz neue Domain übertragen. Dazu benötigen Sie eine zentralisierte Datenmethode oder eine API.

Datenbankmethode: Sie müssen einen Remote-MySQL-Datenzugriff erstellen, damit domain2.com auf die Datenbank auf domain1.com zugreifen kann. Wenn eine Anmeldung durchgeführt wird, sollte nicht nur eine neue Sitzung erstellt werden, sondern auch ein eindeutiges Anmelde-Token (mit Ablaufzeit) in die mysql-Datenbank geschrieben werden. Nun sollten Sie für jeden Link, der von domain1.com zu domain2.com geht, eine $ _GET-Variable hinzufügen, die eine zufällig generierte Session-ID enthält (md5-Hash tut das). domain2.com nimmt beim Empfang des Besuchers die Variable $ _GET, führt sie durch die MySQL-Datenbank, um das Login-Token zu finden, und wenn es eine Übereinstimmung gibt, betrachten Sie diesen Benutzer als eingeloggt (und vielleicht ein $ _COOKIE einbetten) gut, um die Login-Daten zu speichern). Dadurch wird das Anmelden zwischen zwei völlig verschiedenen Domänen übertragbar.

API-Methode: Sie müssen eine API-Methode erstellen, damit domain1.com auf eine externe Anfrage von autorisierten Domänen antworten kann, um das Login-Token beim Weiterleiten eines Benutzers abzurufen. Diese Methode erfordert außerdem, dass alle Links, die von domain1.com zu domain2.com gehen, mit einer $ _GET-Variable angehängt werden, um den eindeutigen Sitzungshash zu übergeben. Nach dem Empfang des Besuchers wird domain2.com eine curl() - Anfrage an domain1.com/userapi.php (oder wie auch immer Sie die Datei nennen) ausführen und die Variablen sollten mit dem verglichen werden, was sich in der Datenbank befindet.

Das ist das Beste, was ich es erklären kann ..Das im Code zu schreiben ist eine wichtige Arbeit, die ich nicht ausführen kann. Aber nach deinem Code zu urteilen, hast du ein sehr gutes Verständnis von PHP, also bin ich zuversichtlich, dass du das durchziehen wirst!

Viel Glück Kumpel.

+0

ok, ich verstehe deinen Gedanken, ich werde es versuchen, danke! – swamprunner7

+0

Süße ... kommentieren Sie hier, wenn Sie weitere Fragen haben, würde ich daran interessiert sein, dies auch zur Arbeit zu bringen. Soweit ich weiß, verwenden Facebook-Authentifizierung auf Websites von Drittanbietern (völlig andere Domänen) eine ähnliche API-Token-Methode. – jeffkee

+0

Einverstanden, aber mit der Empfehlung, dass OP eine bestehende Lösung findet und nicht seine eigene. "Mein erstes Sicherheitssystem" ist notorisch anfällig für Angriffe. –

1

Um Ihre Sitzungen über mehrere Domänen hinweg zu führen, müssen Sie session_set_cookie_params() verwenden. Damit können Sie Ihre Domain angeben. Zum Beispiel ...

session_set_cookie_params(10000, "/", ".main.com"); 

, dass die Session-Timeout bei 10.000 Sekunden für alle Dokumente unter dem Site-Stamm und für alle Sub-Domains von main.com eingestellt werden.

Sie sollten session_set_cookie_params() anrufen, bevor Sie session_start() tun.

+0

ich tat es auch ini_set ("session.cookie_domain", ".main.com"); aber Problem in anderen Domains (one.com, two.com) nicht Subdomains. – swamprunner7

+1

Ah, ich verstehe. Nun, dafür müssen Sie die Sitzungs-ID manuell übergeben und diese Sitzungsinformationen wahrscheinlich irgendwo speichern. Sie können keine Cookies in einer Domäne erstellen und von einer anderen lesen lassen. – Brad

+0

Wie kann ich das tun? – swamprunner7

2

Aber wenn Benutzer domains one.com direkt erreichen, dann kann one.com nicht wissen, ob der Benutzer sich mit der richtigen Antwort wie oben erwähnt angemeldet hat, es scheint, als müssten einige extra js verwendet werden, es ist jsonP! wir lassen account.main.com/userLoginStat.php?callback=loginThisDomain um zu überprüfen, ob Benutzer main.com angemeldet hatte, wenn ja, die js Callback-Funktion loginThisDomain tun Sie etwas, Benutzer auf one.com autologin zu tun.