NUser::isLoggedIn() závislé na Facebooku
- maarlin
- Člen | 207
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í:
- Někde (v
BasePresenter::startup()
?) bude kus kódu, který bude kontrolovat dostupnost Facebookovské cookie a- pokud zjistí, že existuje a zároveň uživatel v Nette není přihlášen, přihlásí ho
- pokud zjistí, že neexistuje a zároveň uživatel v Nette je přihlášen, odhlásí ho
- 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
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)
- maarlin
- Člen | 207
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
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
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
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
a ozaj ak fb nevie vratit email /to som si nie isty/, pouzi id fb, to urcite vracia
- maarlin
- Člen | 207
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
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 :-)
- michal.sanger
- Člen | 4
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
cca:http://skuska.itmava.eu/ – potrebna reg. aplikacie, link ti ukaze len tvoje udaje, nic nezaznamenava
- joe
- Člen | 313
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
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
@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
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).
- joe
- Člen | 313
@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
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).