Jak správně na registraci/přihlašování přes Facebook?

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

Ahoj,

tato diskuse a odpovědi v ní mě přiměli, abych se vás tady zeptal, by teda správná registrace a přihlašování přes Facebook měly vypadat.

Co požaduji?

Okamžitou registraci (a přihlášení) po kliknutí na tlačítko „FB Register“, případně přihlášení po kliku na „FB Login“.

Co se mi nelíbí

Po odhlášení na mých stránkách chci nechat uživatele na Facebooku přihlášeného – nějak nevidím důvod ho odhlašovat i tam, když pracuje na mé stránce. Vemte si příklad, že by měl otevřených třeba pět stránek, na každé byl přihlášený přes FB, na jedné se odhlásí a tím se odhlásí na všech? To se mi nelíbí… Používám tedy FB jen k ověření (jen poprvé) zda je přihlášený a pokud ano, přihlásím ho u sebe a dál mě jeho aktivity na Facebooku (zda je přihlášený nebo se už odhlásil) nezajímají.

Jak to řeším (resp. chci)?

Po kliknutí na „FB Register“ se zobrazí klasická stránka na přihlášení na FB (pokud není přihlášen) a hned poté stránka o povolení k připojení mé aplikace. Po povolení zkontroluju, jestli uživatele s ID co obdržím mám již v databázi.

Pokud ne, vytvořím nového uživatele (při pokusu o vybrání anonymního e-mailu ho odmítnu – tím pak bude moci k přihlášení používat svůj e-mail a heslo a nebo jen tlačítko „FB Login“) a přiřadím mu právě aktivní Facebook účet, nakonec ho přihlásím.

Pokud již v databázi je, vím ke kterému uživateli je napojen a také ho přihlásím → to samé se vlastně děje při kliknutí na „FB Login“.

Pracuji tedy s uživatelem, kterého mám uloženého u sebe v databázi a na žádné cookies od Facebooku se nedívám (kontroluji zda je přihlášen jen při prvním pokusu o přihlášení na mých stránkách).

Po kliknutí na „FB Login“ samozřejmě musí být uživatel k Facebooku přihlášený, já tím tak zjistím pouze jeho ID a hned ho zaloguju.

Otázky

Dělám tedy něco špatně? Dopouštím se někde bezpečnostních chyb? Líbí nebo nelíbí se vám takový postup? Jak byste to řešili nebo jak už to někde vyřešené máte?
K čemu mi je (jako ve zmíněné diskusi) abych věděl, jestli je na Facebooku přihlášený nebo ne?

Je možné, že něco přehlížím a proto se tu ptám. Díky všem za odpovědi :-)

22
Člen | 1478
+
0
-

Doporučuju nastudovat FB API PHP-SDK, podle mě máš hokej v FB autentizaci.

  • jinak pokud řešíš přes PHP, tak k žádnému odhlašení nemusí doházet, akorát ho odhlásíš od své aplikace, FB sessiony se to nijak nedotkne.
  • nechápu, proč ho chceš ve tvé implementaci přihlašovat na základě session z FB, ty chceš přece jen vytáhnout data z FB, mimochodem mail se dá z toho vytáhnout taky, vyplnit mu reg. formulář, pokud chceš ještě jiná data jako tel. apod. co z FB nevytáhneš a pak ho už přihlásíš klasicky, takže název tohoto vlákna je dost nepřesný.
  • jak jsem psal předtím, nemá přece smysl tam dávát FB login tlačítko, když v podstatě tě nezajímá, jestli je uživatel k FB přihlášen nebo jestli jeho účet ještě existuje. Nehledě na to, že ta session taky může vypršet a ty máš v systému pak člověka, který není nijak ověřený
joe
Člen | 313
+
0
-
  • jinak pokud řešíš přes PHP, tak k žádnému odhlašení nemusí doházet, akorát ho odhlásíš od své aplikace, FB sessiony se to nijak nedotkne.

Ok, to nevím, jen jsem to na několika takových webech viděl v akci, že po odhlášení u nich jsem se odhlásil i od Facebooku.

  • nechápu, proč ho chceš ve tvé implementaci přihlašovat na základě session z FB, ty chceš přece jen vytáhnout data z FB, mimochodem mail se dá z toho vytáhnout taky, vyplnit mu reg. formulář, pokud chceš ještě jiná data jako tel. apod. co z FB nevytáhneš a pak ho už přihlásíš klasicky, takže název tohoto vlákna je dost nepřesný.

Přiznám se, že s tím e-mailem si nejsem jistý jak to je, ale pokud se nepletu, tak pokud povolím aplikaci (která e-mail vyžaduje – v té době mám na výběr, jestli ji povolím pravý e-mail nebo anonymní proxy e-mail) a zvolím právě ten anonymní e-mail, tak potom kdykoli ho budu chtít od uživatele získat, dostanu právě ten anonymní.

Název vlákna mi přijde správný, řeším totiž registraci i přihlášení prostřednictvím FB :-)

  • jak jsem psal předtím, nemá přece smysl tam dávát FB login tlačítko, když v podstatě tě nezajímá, jestli je uživatel k FB přihlášen nebo jestli jeho účet ještě existuje. Nehledě na to, že ta session taky může vypršet a ty máš v systému pak člověka, který není nijak ověřený

Proč by to tlačítko nemělo smysl? Uživatel se ke mně dostane prostřednictvím Facebooku, v tu dobu ho tedy kontroluju → musí být na Facebooku přihlášen, aby se mohl přihlásit i ke mně (prostřednictvím toho tlačítka „FB Login“). Pokud nechce přes FB, může použít klasický formulář pro e-mail a heslo (proto ten anonymní proxy e-mail chci zakázat, aby byla možnost i přihlášení se přes klasický e-mail)

Editoval joe (28. 4. 2011 18:48)

22
Člen | 1478
+
0
-

odpovědď na otázku okolo e-mailu je zase v API, pdle toho, co chceš vědět, si vyžádáš permissions a pak už si jen natáhneš data:

$data = simplexml_load_file('https://api.facebook.com/method/users.getInfo?uids='.$this->uid.'&fields=email,first_name,last_name&access_token='.$this->token);
  • podle mého názoru motáš dohromady javascriptový řešení přihlašování a PHP přihlášení
  • jak toho uživatele ověříš při přísštím přihlášení? To mi není teda jasné. To jako si řekneš, že při registraci měl session z FB, tak je do smrti ověřeným uživatelem? Přece takto nefunguje ani autentizace v Nette. Oveřuje se cookie a pokud není nebo vypršelo, musíš se přihlásit znovu a jak to tedy poznáš, když je neoveřuješ? :-)

Buď ho musí ověřit nějaká Nette autentizace nebo musíš ověřit FB session, jestli je platná, jinak nevím, jak to teda myslíš asi.

Filip Procházka
Moderator | 4668
+
0
-
joe
Člen | 313
+
0
-

Co se e-mailu týká, vím, že si ho musím přes permissions vyžádat – jedná se o ‚email‘, ale jak jsem psal, v tomto dialogu, kdy máš aplikaci autorizovat, máš možnost kliknout na „Change“ a zvolit buď svůj skutečný e-mail a nebo anonymní proxy e-mail.
Při pozdějším získávání e-mailu dostaneš právě ten, který sis tady zvolil (v nastavení soukromí to již změnit nejde – jedině smazat znovu a znovu aplikaci autorizovat pod „správným“ e-mailem).

podle mého názoru motáš dohromady javascriptový řešení přihlašování a PHP přihlášení

To nevím jak jsi k tomu přišel :-)

jak toho uživatele ověříš při přísštím přihlášení?

Mám to úplně stejně, jako to má marek-m tady na této stránce což je vzorový příklad, využívám variantu bez JS a bez XFBML, tedy v PHP si nechám vygenerovat $loginUrl, kterou jen předám do hrefu u odkazu.
Pokud na ten odkaz někdo klikne a je přihlášený i k Facebooku → zjistím tak, že je přihlášený, najdu si u sebe v databázi, pokud je spojený s nějakým účtem z mě a pokud je, přihlásím ho ve své aplikaci tak, jako kdyby se normálně nalogoval přes normální formulář.

Pokud přihlášený není, je vyzván nejprve k autentizaci na FB a pak se scénář opakuje. Pokud účet u sebe ale nenajdu, automaticky ho vytvořím a hned ho přihlásím.

Stále teda nevím, k čemu mi ty cookies od FB jsou :-) Je to srozumitelné?

Pokud tedy vyprší cookies nastavená od Nette, je odhlášený… od první chvíle, jak se ke mně přihlásí, už nekoukám na jeho stav na Facebooku. Nezajímá mě.

joe
Člen | 313
+
0
-

@HosipLan: Ano, vždyť z toho vycházím… ptám se, jestli je můj postup správný, nevím proč bych totiž měl ověřovat cookies od FB. Možná mi ale pořád něco uniká…

A nebo zkusím něco udělat a ukážu kód, jak to mám, aby to bylo úplně jasné…(?)

22
Člen | 1478
+
0
-

nevím, ale domnívám se, že taková cookies z FB se dá určitě podstrčit, jako jakákoliv jiná.. proč ti to ověření vlastně tak vadí? :-)

Editoval 22 (28. 4. 2011 19:42)

joe
Člen | 313
+
0
-

Mně ověření samozřejmě nevadí, kvůli pár písmenkům v kódu (jedné podmínce) to tady nepíšu :-)

Já jenom jestli tam není nějaká bezpečnostní chyba nebo proč maarlin z té diskuse chce ověřovat cookie od FB. Tak jestli mi náhodou něco neuniká…

Editoval joe (28. 4. 2011 20:00)

maarlin
Člen | 207
+
0
-

joe napsal(a):

Mně ověření samozřejmě nevadí, kvůli pár písmenkům v kódu (jedné podmínce) to tady nepíšu :-)

Já jenom jestli tam není nějaká bezpečnostní chyba nebo proč maarlin z té diskuse chce ověřovat cookie od FB. Tak jestli mi náhodou něco neuniká…

Předpokládám, že předmětem diskuze je samotný účel ověřování cookie, nikoliv diskuze proč ano/ne registrace+ vysosání údajů z Facebooku a „opuštění“ Facebooku. Důvody k tomu, proč chci zcela vynechat registraci jsem se pokusil nastínit v uvedeném vlákně.

  1. Snažím se chovat poslušně vůči uživatelům – uživatel se třeba za týden může rozhodnout revoknout přístup ke svým informacím pro mojí aplikaci a ta aplikace by to měla respektovat – tzn. neměla by ho zpětně přihlásit, pokud uživatel zakázal aplikaci přístup, nebo se prostě jen odhlásil z Facebooku.
  2. Přesto, že to tak spousta aplikací a vývojářů dělá, Facebook Platform Policies říkají, že bys ideálně neměl ukládat data o uživateli k sobě (resp. určitě ne tak, jak zamýšlíš ty). Respektive pokud je potřebuješ uložit, mělo by to být třeba kvůli „cachování“ (přesněji „better user experience“) a tato data bys měl udržovat pokud možno aktuální.

II. Storing and Using Data You Receive From Us

2. You may cache data you receive through use of the Facebook API in order to improve your application’s user experience, but you should try to keep the data up to date. This permission does not give you any rights to such data.

12. You will delete all data you receive from us concerning a user if the user asks you to do so, and will provide an easily accessible mechanism for users to make such a request. We may require you to delete data you receive from the Facebook API if you violate our terms.

  1. btw.

I. Features and Functionality

6. Your website must offer an explicit „Log Out“ option that also logs the user out of Facebook.

22 napsal(a):

nevím, ale domnívám se, že taková cookies z FB se dá určitě podstrčit, jako jakákoliv jiná.. proč ti to ověření vlastně tak vadí? :-)

Cookie sice můžeš podstrčit, ovšem obsahem cookie přirozeně není jen FB UID, ale třeba tzv. access token, bez kterého nezískáš informace o daném přihlášeném uživateli. Takže přeji příjemné dny při hádání ~100 místného řetězce znaků… ;)

Pokud na ten odkaz někdo klikne a je přihlášený i k Facebooku → zjistím tak, že je přihlášený

A jak zjistíš jeho e-mail, nebo jiný identifikační údaj, když ne z cookie?

Editoval maarlin (28. 4. 2011 20:33)

22
Člen | 1478
+
0
-

maarlin napsal(a):
Cookie sice můžeš podstrčit, ovšem obsahem cookie přirozeně není jen FB UID, ale třeba tzv. access token, bez kterého nezískáš informace o daném přihlášeném uživateli. Takže přeji příjemné dny při hádání ~100 místného řetězce znaků… ;)

vzhledem k tomu, že kolega se ji nechystá kontrolovat vlastně, tak ten token tam asi nehraje roli, ne?

joe
Člen | 313
+
0
-

@maarlin:

Díky moc za tvou odpověď, hodně mi pomohla. S tím prvním bodem souhlasím, vlastně i s tím druhým, jen bych k tomu ještě něco napsal/zeptal se.

Pokud bych ty data ukládal k sobě, dalo by se říct, že se jedná o „cachování“, abych je pokaždé netahal od nich. Před každým přihlášením by tak mělo ještě být zjištění, jestli je má aplikace stále autorizována → pokud se nepletu, pak bych se pomocí ní ani nepřihlásil, nedostal bych žádnou session a uživatele bych tak nepřihlásil.

Když ale ty data nemohu ukládat k sobě, pak by tento problém řešilo předvyplnění formuláře, kde by pak uživatel musel registraci dokončit sám. Vlastně se mi to zdá stejné, jako když se provede registrace automaticky (uživatel vidí, co všechno aplikaci povoluje) a jde mi jen o „základní“ údaje jako je jméno, datum narození a skutečná e-mailová adresa.

Mj. se na stránce taky píše:

If you stop using Platform or we disable your application, you must delete all data you have received through use of the Facebook API unless: (a) it is basic account information; or (b) you have received explicit consent from the user to retain their data.

To znamená, že by to řešila nějaká taková věta u tlačítka pro FB registraci:

„Souhlasím s uchováním údajů obdržených z mého Facebook účtu.“

A jak zjistíš jeho e-mail, nebo jiný identifikační údaj, když ne z cookie?

:-) Máš pravdu, vlastně mi nedošlo, že oba myslíme to samé (ono to ani jinak nejde). Jinak unikátní identifikátor je FB UID, ne e-mailová adresa (ta může být dvojí).

Adel
Člen | 1
+
0
-

Tam je řešení tohoto problému skutečně. Takže se můžete dostat představy o pomoc přihlašovací facebook z lokalit, jako je www.facebook.com login