Autor Zpráva
Andrasin
Profil
Ahoj,

programuju právě systém registrace, který funguje tak, že uživatel má možnost registrovat se buď klasicky, vyplněním username, emailu, hesla nebo kliknutím na tlačítko přihlásit přes facebook. Z facebooku si aplikace natáhne údaje a údaje o něm uloží do databáze a rovnou ho přihlásí.

V databázi je username a email unikátní hodnotou. A já jsem narazil na problém, že jakmile se uživatel na mou stránku registruje přes facebook, může nastat situace, kdy získaná uživatelova přezdívka z facebooku v databázi již existuje u účtu vytvořeného klasickým způsobem. Stejně tak může nastat situace, že si účet přes facebook vytvoří někdo, kdo u svého profilu přezdívku vůbec nemá, do databáze se tedy vloží NULL...

Zajímalo by mě, jak byste tuto situaci řešili. Napadají mě možnosti jako vyhodit ze systému username a pro přihlašování používat email nebo pro případ shody nebo absence username na facebooku nějaký username uživateli vygenerovat, například z jeho jména, emailu... ale nevím. Podělte se prosím...
Alphard
Profil
Já měl u posledního projektu s fb tabulku

CREATE TABLE `users` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `login` varchar(100) DEFAULT NULL,

  `password` char(40) DEFAULT NULL,
  `mail` char(40) DEFAULT NULL,
 
  `oauth_uid` bigint(20) unsigned DEFAULT NULL,
  `oauth_provider` varchar(100) DEFAULT NULL,
  
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Null není problém. Když hledám v normálně registrovaných, požaduji oauth_uid is null, když hledám podle fb, je to jasné.

$row = $userM->getUserIdentity()->where('u.login = %s', $username)->where('u.oauth_provider is null')->fetch();
$row = $userM->getUserIdentity()->where('oauth_uid = %s', $fbId)->where('oauth_provider = \'facebook\'')->fetch();
Andrasin
Profil
Jasně, tohle není problém, jde mi spíš o problémy, které následně nastanou a o celkový návrh celého toho systému. Nakonec bych to asi nejradši udělal tak, že při registraci přes facebook vůbec nebudu získávat uživatelovu fb přezdívku, ale jen jeho jméno a příjmení a username tedy bude NULL. Klasičtí uživatelé tedy v aplikaci budou působit pod svým username a fb uživatelé pod svým pravým jménem.

Takže tedy řekněme, že v aplikaci budou například pod články komentáře. Normálně registrovaný uživatel musí mít nastavený username, takže u příspěvku bude mít jako autor příspěvku svůj username. Pokud je to fb uživatel, nick nastavený mít nebude, takže jako autor u příspěvku bude mít jméno a příjmení. Co když se ale pak fb uživatel rozhodne, že si zruší svůj fb účet nebo se prostě rozhodne, že už se přes něj přihlašovat chtít nebude. Pro tento případ bych asi do aplikace nasadil nějakou možnost převést fb účet na klasický účet, což přinese nutnost, aby si uživatel při převodu nastavil username a nějaké heslo, pokud již tyto údaje nastavené nemá (to může nastat v případě, že se účty spárují po tom, co se klasicky registrovaný uživatel přihlásí přes facebook). A jakmile získá username, tak by se u všech jeho starých příspěvků změnilo jeho facebook jméno na username, což mi nepřijde moc vhodné.
joe
Profil
Andrasin:
Z účtu na facebooku si vyžádej e-mailovou adresu, ta je unikátní v rámci tvé databáze. Takže se pak uživatel může přihlašovat jak klasicky, tak přes facebook nebo další sociální sítě, pokud jim to umožníš.

Alphard:
Nebylo by od věci "vyhodit" sloupce oauth_uid a oauth_provider do zvláštní tabulky ještě se sloupcem user_id, kvůli případnému rozšíření dalších sítí, které podporují oauth
Andrasin
Profil
joe:
V podstatě by to asi bylo řešení. E-mail z facebook tahám, slouží i jako identifikátor, zda-li člověk, který se právě registruje přes fb, nemá již vytvořený klasický účet a zda-li tedy má dojít ke spárování účtů.

Jediný problém by asi byl, že pokud si uživatel vytvoří účet přímo přes facebook, u účtu tím pádem nebude nastavené žádné heslo. V případě, že se nebude moct přihlásit přes facebook, se tedy nepřihlásí vůbec. Musel by asi jedině využít zaslání nového hesla na email.
joe
Profil
Andrasin:
Je několik způsobů jak heslo řešit. Například až v době, kdy k tomu dojde - tedy zeptáš se ho na nové heslo (protože žádné ještě nemá nastavené) a zašleš mu aktivační e-mail na jeho adresu, vygeneruješ mu náhodné heslo a to odešleš mu pošleš a nebo to uděláš hned při registraci přes FB, kde mu sdělíš, že se může přihlašovat i klasickým způsobem.

Vaše odpověď

Mohlo by se hodit

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

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