NUser::isLoggedIn() závislé na Facebooku

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
maarlin
Člen | 207
+
0
-

Právě řeším, jak napojit autentizaci v Nette na FB Connect.

Ve zkratce:

Pokud je uživatel na Facebooku přihlášen, má nastavenou cookie s názvem fbs_%app_id%.
Rád bych, kdyby metoda NUser::isLoggedIn() respektovala prvně tuhle cookie a teprve potom se ptala na vlastní cookie, kterou nastavuje samo Nette.

Napadlo mě několik způsobů, jak to řešit, z nichž ani jeden se mi nelíbí:

  1. Někde (v BasePresenter::startup() ?) bude kus kódu, který bude kontrolovat dostupnost Facebookovské cookie a
    1. pokud zjistí, že existuje a zároveň uživatel v Nette není přihlášen, přihlásí ho
    2. pokud zjistí, že neexistuje a zároveň uživatel v Nette je přihlášen, odhlásí ho
  2. Provrtám Nette skrz na skrz a upravím prostě metodu NUser::isLoggedIn(), která je mmj. final…

Jak byste na to šli vy?

Editoval maarlin (27. 4. 2011 9:12)

marek-m
Člen | 66
+
0
-

Pokial existuje fbs_%app_id% a na nom zavisli email, overil by som ho voci databaze uzivatelov, ci existuje email a ci ma povolenie na fb login. Cize autorizacia by sla cez fb alebo cez heslo. Pri reg. by som to prave takto zapisal. Uzivatel by si mohol potom v svojom rozhrani zakazat alebo povolit fb login

Editoval marek-m (27. 4. 2011 9:37)

marek-m
Člen | 66
+
0
-

rozhranie IAuthenticator ti postaci, BasePresenter by kontoloval ci je uzivatel prihlaseny a ak nie a existuje fbs_%app_id% pokusi sa o autorizaciu

Editoval marek-m (27. 4. 2011 9:42)

maarlin
Člen | 207
+
0
-

marek-m napsal(a):

Pokial existuje fbs_%app_id% a na nom zavisli email, overil by som ho voci databaze uzivatelov, ci existuje email a ci ma povolenie na fb login. Cize autorizacia by sla cez fb alebo cez heslo. Pri reg. by som to prave takto zapisal. Uzivatel by si mohol potom v svojom rozhrani zakazat alebo povolit fb login

Registrace zbytečný a zdlouhavý proces, který nechci nechat uživatele podstupovat, když nemusím…
Rád bych to právě měl přímo napojené na Facebook – prostě uživatel klikne „Connect“, odsouhlasí požadovaná oprávnění a nastaví se cookie, kterou já prostě odchytím.

Otázka, nad jejíž odpovědí váhám zní:
„V jakém místě aplikace kontrolovat dostupnost fbs_%app_id% cookie?“

maarlin
Člen | 207
+
0
-

marek-m napsal(a):

rozhranie IAuthenticator ti postaci, BasePresenter by kontoloval ci je uzivatel prihlaseny a ak nie a existuje fbs_%app_id% pokusi sa o autorizaciu

BasePresenter asi bude nejlepší řešení, jen se mi nelíbí, že to není úplně zapouzdřené… tedy leží to jen tak „volně“ v BasePresenteru a za předpokladu, že budu potřebovat použít autentizaci třeba v jiném modulu (Front, Admin, whatever), tak budu muset překopírovat ten kus kódu do nového BasePresenteru…

Ideální by bylo to prostě nějak mít možnost naroubovat přímo k NUser::isLoggedIn()

Dle mých představ by to fungovalo tak, že ať zavolám kdekoliv a kdykoliv (nezávisle na nějakém volání předchozích BasePresenter::startup() apod.) isLoggedIn(), tak to bude schopné se sesynchronizovat se stavem přihlášení na Facebooku a vrátit pravdivou hodnotu především vůči Facebooku.

Editoval maarlin (27. 4. 2011 9:49)

marek-m
Člen | 66
+
0
-

podla mna je to v poho v BasePresenter a v startup, praveze podla mna aj najvhodnejsie. Mozno ak nepotrebujes overenie prihlasenia uz pri zobrazeniu zakladneho presenteru, mozes to savesit na napr. SecuredPresenter, kde ti prebehne tato vec je to len malicky kus kodu overenia, co aj tak musis urobyt pri overeni.

co sa tyka registracie, dal by som aj registraciu bez fb a sucasne len klik, fb connection /co ti predviplni, resp. zapise do fb, potrebne udaje/. Aj ked ludia pouzivaju FB, doverihodnost je dost nizka a znalost je dost nizka – moj nazor. Kdesi mam aj priklad super riesenia, len to neviem takto narychlo vyhrabat

<?php
	public function startup()
	{
		if (!$user->isLoggedIn()) {
			volat metodu pre overenie fb a vratenie email //if
			$this->user->login($email);
        	}

		parent::startup();
	}

?>
maarlin
Člen | 207
+
0
-

Jediná berlička, která mě ještě napadá, udělat ještě jeden, „kořenový“ BasePresenter, ze kterého teprve budou všechny ostatní BasePresentery dědit…

Ale stále se mi nelíbí myšlenka, že stav přihlášení, který má obsluhovat především NUser začne být najednou závislý na volání BasePresenter::startup()

Jaká je pak přenositelnost takového řešení? imho dost špatná…

marek-m
Člen | 66
+
0
-

a ozaj ak fb nevie vratit email /to som si nie isty/, pouzi id fb, to urcite vracia

cca:http://skuska.itmava.eu/

maarlin
Člen | 207
+
0
-

marek-m napsal(a):

podla mna je to v poho v BasePresenter a v startup, praveze podla mna aj najvhodnejsie. Mozno ak nepotrebujes overenie prihlasenia uz pri zobrazeniu zakladneho presenteru, mozes to savesit na napr. SecuredPresenter, kde ti prebehne tato vec je to len malicky kus kodu overenia, co aj tak musis urobyt pri overeni.

co sa tyka registracie, dal by som aj registraciu bez fb a sucasne len klik, fb connection /co ti predviplni, resp. zapise do fb, potrebne udaje/. Aj ked ludia pouzivaju FB, doverihodnost je dost nizka a znalost je dost nizka – moj nazor. Kdesi mam aj priklad super riesenia, len to neviem takto narychlo vyhrabat

<?php
	public function startup()
	{
		if (!$user->isLoggedIn()) {
			volat metodu pre overenie fb a vratenie email //if
			$this->user->login($email);
        	}

		parent::startup();
	}

?>

Marku, vtip je právě v tom, že já ani po nich e-mail nemusím chtít…
Nedůvěryhodnost spočívá především v tom, že požaduješ po uživateli spoustu údajů, které ve skutečnosti k dané transakci (třeba zpřístupnění nějakých funkcí pro konkrétní FB UID) nepotřebuješ.

Tvrdit, že obecně Facebook Connect je nedůvěryhodný je dost odvážné…

marek-m
Člen | 66
+
0
-

Marku, vtip je právě v tom, že já ani po nich e-mail nemusím chtít…
Nedůvěryhodnost spočívá především v tom, že požaduješ po uživateli spoustu údajů, které ve skutečnosti k dané transakci (třeba zpřístupnění nějakých funkcí pro konkrétní FB UID) nepotřebuješ.

Tvrdit, že obecně Facebook Connect je nedůvěryhodný je dost odvážné…

maz pravdu, vsetko vsak zavisi na charaktere, resp. obsahu stranky :-)

Aurielle
Člen | 1281
+
0
-

Nevím přesně, jak funguje FB connect, ale přece se ze své aplikace nedostaneš na facebook.com cookie ne?

michal.sanger
Člen | 4
+
0
-

gmvasek napsal(a):

Nevím přesně, jak funguje FB connect, ale přece se ze své aplikace nedostaneš na facebook.com cookie ne?

Dostaneš, resp. funguje to tak, že když registruješ svou app na FB, zadáváš tam i doménu na které běží a pro ni pak FB nastavuje cookie.

marek-m
Člen | 66
+
0
-

cca:http://skuska.itmava.eu/ – potrebna reg. aplikacie, link ti ukaze len tvoje udaje, nic nezaznamenava

joe
Člen | 313
+
0
-

Ahoj, chystám se na web taky přidat FB přihlášení, jen nechápu, k čemu je kontrola přihlášení na Facebooku? Já bych to udělal tak (teda mám to v plánu), že pokud návštěvník klikne na Facebook Login, pokud nemá účet, tak ho zaregistruju a hned přihlásím (žádné další údaje nejsou potřeba). Přihlášení pak ale kontroluju už jen v rámci mé aplikace, nikoli Facebooku, nevidím k tomu důvod. Možná je to špatně (?). Já bych tedy na cookie od Facebooku vůbec nekoukal nebo jsem snad něco špatně pochopil? K čemu mi je dobré kontrolovat v mé aplikaci, jestli je na Facebooku pořád přihlášený (to mě přece vůbec nezajímá, ne – on použil FB login jen pro to, aby se přihlásil na mém webu)?
Osobně nemám rád, pokud se někam přes Facebook přihlásím a potom se na tom webu odhlásím a ono mě to odhlásí i od Facebooku, odhlašuju se přece na tom webu, ne na FB…

Editoval joe (28. 4. 2011 16:24)

Mikulas Dite
Člen | 756
+
0
-

Funguje to jako jednotný login, ne jako jednotná registrace. Právě proto to odhlašuje všechny aplikace. Někde jsem i četl, že je to záměr lidí z fb, aby se bfu při odlogování nedivil, proč ho to z fb neodhlásilo a někdo cizí mu tam vlez.

Pokud jde pouze o ta data, radši bych vyplnil formulář než dával práva na fb account. A navíc bych je po registraci musel manuálně revoknout, protože to tvoje aplikace neudělá ; ).

22
Člen | 1478
+
0
-

@Joe: každopádně by jsi měl kontrolovat FB session, už z bezp. hlediska. Přece nemůže být přihlášený do tvé aplikace, aniž by jsi měl ověřeno, že je přihlášen na FB?! S odhlášením to podle mě nemá co dělat, protože se to vždy řídí stavem přihlášeni k FB.

Editoval 22 (28. 4. 2011 17:35)

Mikulas Dite
Člen | 756
+
0
-

22: jeo vůbec nechce používat tu jejich logiku pro login, jenom chce vytáhnout data na registraci a pak používat vlastní login systém (resp. ten z Nette).

22
Člen | 1478
+
0
-

ajo, sry :-) ale proč lidi nutit se přihlašovat do aplikace přes form, když to jde přes jeden button FB login, když už je registruju přes FB. OK, už mlčím.

joe
Člen | 313
+
0
-

@Mikulas Dite: chci používat FB i k přihlašování.

@22: Ano, samozřejmě, že ověřím stav přihlášení k FB (ale jen jednou, před přihlášením u mě).

Nerad bych to tu zapsal příspěvkama mimo téma, vytvořil jsem proto novou diskusi o FB registraci/přihlašování, kde jsem popsal, jak to řeším a rád bych, kdybyste mi to „ohodnotili“ nebo něco napsali.

Díky a omlouvám se za příspěvky mimo v této diskusi.

Ondřej Mirtes
Člen | 1536
+
0
-

Celé vlákno jsem jel projel očima, ale přidám i svou zkušenost s implementací FB přihlášení.

Musíš oddělit ověření Facebooku a přihlášení uživatele v aplikaci. Ta nastavená cookie ti jen dává vědět, že se uživatel právě proklikl přes FB connect a dal tvé aplikaci povolení pro přístup k jeho datům. V akci, kam přeposíláš uživatele z FB connect, ho tak verifikuj ve svojí databázi (měl bys mít nějakou tabulku mapování UID ↔ User) a případně ho u sebe „zaregistruj“. Uživatele pak přihlaš klasicky přes User::login() (s nějakým dummy autentikátorem), aby se do session dostala serializovaná Identity. FB cookie pak smaž, protože ji už k ničemu nepotřebuješ a jen by dělala zmatky (např. když ti Nette cookie vyprchá dřív než ta FB, tak se uživatel k tobě nepřihlásí, protože mu FB bude tvrdit, že přihlášený je).