Autor Zpráva
candiess
Profil
Zdravím kolegové,
setkal jsem se s velkým problémem a chtěl bych od vás poradit.

Pracuji na aplikaci, na které si uživatel tvoří své vlastní subdomény (klasika wbs.cz), ovšem narazil jsem na problém, jak přenášet status přihlášení mezi subdoménou a serverem pro více domén.

Řekněme, že domovská stránka je example.cz, na této se uživatel přihlašuje a má tam svou administraci. Když si zakládá nový web, má na výběr z koncovek (example.cz, pomerancuju.cz, bananuju.cz ,..) a tak si založí svůj web (banan.bananuju.cz).

Jak předat této subdoméně (doméně) jeho cookies z example.cz (domovská doména)?

Doposud jsem řešil tímto zápisem session_set_cookie_params(0, "/", ".example.cz"), ale tím mi odpadají ostatní domény.

Napadá mě jediné řešení a to, že si udělám nějaký vlastní handler (mini-databázi) a cookies budu posílat na všechny moje domény (myslím, že to setcookie() podporuje). Má někdo jinčí řešení/jak to dělá třeba wbs.cz?

Díky moc všem za reakce
Jan Tvrdík
Profil
candiess:
cookies budu posílat na všechny moje domény (myslím, že to setcookie() podporuje)
To rozhodně nepodporuje. Nelze nastavit cookie pro cizí doménu. Viz třeba Cross domain login
candiess
Profil
A jak to alespoň vyřešit přes cURL? Když jsem na skriptu www.example.cz/check.php výstup bude true (je tam rozhodování jestli jsem online nebo ne), ovšem když na ten skript jdu přes cURL tak mi to vyhodí false.

function curl_download($Url){
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $Url);
    curl_setopt($ch, CURLOPT_REFERER, "http://example.cz");
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_TIMEOUT, 5);
    $output = curl_exec($ch);
    curl_close($ch);
    return $output;
}
$a = curl_download("www.example.cz/check.php"); //false
candiess
Profil
A doplňující otázka, proč zápis
<script type="text/javascript" src="http://example.cz/check.php"></script>
mi ukáže true i když jsem na bananuju.cz?
Micruss
Profil
A neměl bys mít ten začátek spíš mít takhle?

$ch = curl_init($Url);
candiess
Profil
Micruss:
Nene, nepomohlo

Opravdu nikdo, kdo tohle neřešil?
Alphard
Profil
Jak má tenhle způsob fungovat? Kde (na jaké doméně) probíhá autentizace a kde se bere identifikační cookie?
candiess
Profil
Alphard:
Má to fungovat tak, že když jsem na bananuju.cz pošle se mi request na example.cz a ten mu vráti jestli jsem online nebo ne (tahání cookies). Klasický cross-domain login. Řešení přes Jsonp jsem našel, jenže toto potřebuji kontrolovat na úrovni php nikoliv JS
Alphard
Profil
Já si nejsem jist samotným principem. Imho request vedený z bananuju.cz nemůže znát cookies přiřazené k example.cz, takže je ani nepřidá do požadavku. example.cz nemá dost informací, aby se mohl správně rozhodnout. Nemělo by to fungovat.
Tohle řešení někde funguje, nebo jste to vymyslel?
candiess
Profil
Alphard:
Imho request vedený z bananuju.cz nemůže znát cookies přiřazené k example.cz,
A jak se to tedy dá řešit?

Jak jsem zmínil, mám domény bananuju.cz, pomerancuju.cz, bla bla.. a centrální doména je example.cz, na té se přihlásím a chtěl bych sdílet cookies s ostatními doménami.

A vůbec, jaktože to potom takto funguje přes JSONP? -> Jsem na bananuju.cz a v hlavičce mám skript odkazující na adresu example.cz/check_me.php, v něm mám [pokud session online return true sle false] a když sem přihlášen vrátí true v opačném případě false. Tady snad také prohlížeč neví, jestli jsem přihlášen nebo jsem host, ne?

Tohle řešení někde funguje, nebo jste to vymyslel?
Stavím na výše zmíněné větě, pokud to funguje v JS, tka proč né v PHP? Requesty jsou stejné..


Domplňující otázka, jak to řeší třeba wbs.cz nebo jinačí takovéto servery? Posílají stejné cookies na všechny své domény??
Alphard
Profil
Ty requesty (vyvolané js a php) nejsou a nemohou být stejné, to je podle mě zásadní omyl. Navrhované řešení nemůže podle mě fungovat.

Já sám jsem to neimplementoval, nerad by tedy mystifikoval, ale když nikdo jiný neodpovídá, viděl bych to nějak takhle:
Přesměrujte klienta na example.cz. Je-li přihlášen, přesměrujte zpět s nějakým tokenem v url. Následně přes cURL ověřte validitu toho tokenu (pokud je sdílená db, bude to lehčí). Pokud není přihlášen, nechte ho na example.cz přihlásit a pak pokračujte podle původního scénáře. Po ověření na dílčí doméně vytvořte cookies platnou pro tu doménu.

Prostě si stáhněte nějaku pěknou třídu pro OpenId a podívejte se, jak to dělají :-)
candiess
Profil
Alphard:
Děkuji, pokusím se to praktikovat ;)

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: