Facebook Connect pro nette

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

Vytvořil jsem jednoduchý doplněk, který integruje Facebook PHP SDK do nette.

Dokážete díky němu autorizovat uživatele (username, FB_ID, email…) na klasickém webu anebo vytvořit FB aplikaci na apps.facebook.com. De facto se tyto dvě možnosti nijak zásadně neliší – v druhém případě je obsah canvas_url (== váš web) zobrazen v IFRAME na app_namespace URL (FB adresa aplikace). Další čtení je na GitHubu.

Instalace pomocí Composeru (github…#2-instalace)

{
    "minimum-stability": "dev",
    "require": {
        "illagrenan/nette-facebook-connect": "dev-master"
    }
}

Konfigurace (github…#3-konfigurace)

common:
    includes:
        - facebook/facebook.neon

production < common:
    includes:
        - facebook/facebook_production.neon

development < common:
    includes:
        - facebook/facebook_dev.neon
common:
        # ...
        services:

            # ...

            facebook:
                class: \Illagrenan\Facebook\FacebookConnect([appId: %facebook.app_id%, secret: %facebook.app_secret%],@container)
                setup:
                    - setHeaders()

            # ...

Použití (github…5-použití)

...

public function renderDefault()
        {
            /* @var $fb Illagrenan\Facebook\FacebookConnect */
            $fb = $this->context->facebook;

            // Autorizoval uživatel naši aplikaci?
            if ($fb->isLoggedIn() === FALSE)
            {
                // Volitelně můžeme změnit URL, na kterou bude uživatel z Facebooku navrácen
                $redirectUri = $this->link("//Homepage:default");
                $fb->setRedirectUri($redirectUri);

                // Přihlásíme ho přesměrováním na Login_URL
                $fb->login();
            }
            else // Uživatel je přihlášený v aplikaci
            {
                /* @var $user Illagrenan\Facebook\FacebookUser */
                $user = $this->template->user = $fb->getFacebookUser();
                Debugger::dump($user);
            }
        }
...

Zde je jen hrubá dokumentace, tu kompletní naleznete na GitHubu.

Velmi vřele uvítám připomínky a návrhy na zlepšení ;o)))

Filip Procházka
Moderator | 4668
+
0
-

Snad promineš mou upřímnost, ale není to moc kvalitní doplněk.

  • Původní Facebook SDK je na blití sahá na globální proměnné a celý je napsaný jak od od retardovaného koně po lobotomii. Stavět na tomhle není moc dobrý nápad.
  • Na konfiguraci používáme CompilerExtension
  • Přesměrování pomocí script v HTML ? Tohle je tam nejspíš kvůli přenášení sušenek do javascriptu. Nenapadá mě jiný příčetný důvod, proč bych měl přesměrovávat takhle retardovaně. Každopádně to není potřeba vždy. Někdy stránka nevyužívá javascriptové FB API a tohle je překážkou. Navíc to provedení… Když už je tohle absolutně nutné, tak by bylo lepší přesměrovat uživatele na signál komponenty, která by vykreslila tohle přesměrování v nějaké uživatelsky přívětivé podobně. Vyzvracet to na aktuální stránku není dobrý nápad. Celá tahle třída je jeden velký omyl
  • v composeru nemáš definici autoloadu
  • statické properties ? Proč?

Co ale můžu pochválit, tak to, že jsi použil composer :)

illagrenan
Člen | 12
+
0
-

Ahoj a díky.

  1. S (ne)kvalitou originální SDK naprosto souhlasím. A koukám tedy, že přicházím s doplňkem s křížkem po funuse (https://github.com/…SDKExtension).
  2. O CompilerExtension jsem nikde neslyšel / neviděl, takže díky.
  3. Přesměrování pomocí JS má důvod na CANVAS_PAGE, tedy v momentě, kdy je aplikace načtená v IFRAME. Pokud bych přesměrovával ->redirect(...), měl bych „Facebook v Facebooku“.
  4. + 5) (U)Opravím
Filip Procházka
Moderator | 4668
+
0
-

3. díky za objasnění – ale stejně, použití komponenty a vykreslení v signálu je mnohem čistější.

Nechtělo by se ti raději přispět ke mě? Přecejenom už toho mám víc než ty a hodil by se mi někdo, kdo by otestoval věci, které zatím nepotřebuju/nepoužívám :)

Mám rozdělaný social sandbox, kde chci integrovat sociální sítě – twitter a fb prozatím. Tak abych veděl, jestli si mám pohnout, aby bylo na čem testovat :)

Editoval HosipLan (11. 9. 2012 16:53)

22
Člen | 1478
+
0
-

3. tohle je snad hack jen pro IE..
…jinak nikde nevidím, že by jsi řešil zobrazovani canvas aplikace v IE nebo Safari, když už se snažíš podporovat canvas app.

illagrenan
Člen | 12
+
0
-

HosipLan
Nemám s tím problém. Až bude sandbox, rád se na to podívám.

22
Ne ne to je pro všechny prohlížeče. Jde o to, že uživatel má na apps.facebook.com/foo-bar zobrazený IFRAME s mojí aplikací a já ho z něj potřebuji někam přesměrovat (typicky na autorizační dialog nebo někam mimo FB).

Je to ekvivalent k:

<a href="..." target="_top">...</a>
22
Člen | 1478
+
0
-

hmhm, už jsem to delší dobu canvas nedělal, ale měl jsem za to, že k tomu snad slouží nastavení aplikace na facebooku, kde definuješ jak canvas url, tak app url, v samotné applikaci si pak nastavíš redirect_uri na canvas url, ale přít se o to nebudu.

illagrenan
Člen | 12
+
0
-

To jo to je ± pořád stejné, jde ale o to, jak uživatele dostat z canvasu na auth dialog – pak už si to skutečně převezme redirect_uri.

22
Člen | 1478
+
0
-

jo, řek bych, že máš pravdu a jinak to asi fakt nejde vyřešit.

Felix
Nette Core | 1110
+
0
-

HosipLan napsal(a):

Nechtělo by se ti raději přispět ke mě? Přecejenom už toho mám víc než ty a hodil by se mi někdo, kdo by otestoval věci, které zatím nepotřebuju/nepoužívám :)

Mám rozdělaný social sandbox, kde chci integrovat sociální sítě – twitter a fb prozatím. Tak abych veděl, jestli si mám pohnout, aby bylo na čem testovat :)

Ten napad social sandbox se mi libi. Klidne ti s tim pripadne pomuzu nebo otestuju.. Muzeme pouzit i FbTools.

Filip Procházka
Moderator | 4668
+
0
-

Pohnu si :) Zítra nebo v pátek na to kouknu.

potapnik
Člen | 127
+
0
-

Hosiplan: koukam na ten Facebook extension od Tebe, je to realne pouzitelny pro FB appku bezici na apps.facebook.com? Nikde jsem tam nenasel nejaky examples, use of case, jak to zaradit do stavajici Nette aplikace…s testovanim muzu taky pomoct :-)

Filip Procházka
Moderator | 4668
+
0
-

Já to používám zatím jen na přihlašování a načítání údajů o uživateli, ale to API pro komponenty není úplně ideální – budu ho ještě dolaďovat.

Jinak je to v podstatě jenom zrefaktorované původní SDK od Facebooku, ze kterého se mi protáčel žaludek. Dokonce i API je velice podobné.

Takže ano, mělo by to být použitelné. Mám teď hodně na spěch, takže se tomu nemůžu věnovat, ale má to vysokou prioritu, takže se vynasnažit se k tomu dostat co nejdříve!

potapnik
Člen | 127
+
0
-

Fajn, mě stačí vlastně jenom jednoduchý CURL wrapper na aplikace v tabu a na apps.facebook.com, takže něco spíchnu sám, aspoň pochopím jak to všechno funguje.

Až to bude s tím tvým FB API aktuální, tak rád pomůžu.

PHP SDK je opravdu k zblití. Sice jsem myslel, že si spravím chuť použitím čistého CURL a GRAPH API, jenže např. extended access tokeny to posílá jako string, ze který si parsuješ array, ostatní jde jako JSON, takže taky žádná skvělá čistá nádhera…

akadlec
Člen | 1323
+
0
-

@Filip Procházka: ahoj, tak co jak jde vyvoj toho FB api? Stáhnul sem si jej od tebe z gitu ale zatím v něm mám hokej ;) Už mám implementovaný twitter a google a teď se pokouším nahodit i fb. Nechtěl bys udělat nějaký malý nástřel. Služby mám implementované, ale lámu si hlavu jak udělat detekci zda je přihlášen a pak postupné přesměrování atd.

Zatím co se mě povedlo nějak implementovat authenticator:

public function authenticate(array $credentials)
{
	try {
		if ( !$this->facebook->getProfile() ) {
			$url = $this->facebook->createDialog('login')->getUrl('page');

			if ( $url ) {
				$this->httpContext->response->redirect($url);

				throw new \Nette\Application\AbortException; // stop!

			} else {
				throw new NS\AuthenticationException("Could not connect to Facebook. Refresh the page or try again later.");
			}

		} else {
			$accessToken = $this->facebook->getAccessToken();

			// Get data about user from facebook
			$facebookUser = $this->facebook->getProfile()->getDetails();

			if ( $facebookUser ) {
				// Pokracovani dale ve hledani usera, connectoru atd.

			} else {
				throw new NS\AuthenticationException("Could not authenticate you.");
			}
		}

	} catch ( NS\AuthenticationException $e) {
		$this->facebook->destroySession();

		throw $e;
	}

	return new Identity($user, $connector);
}

Editoval akadlec (25. 5. 2013 18:44)

Filip Procházka
Moderator | 4668
+
0
-

@akadlec: to není úplně ideální řešení, založil jsem si issue a zkusím na to co nejdříve kouknout :) Dyštak mě tam můžeš urgovat a rejpat do mě, kdy už to bude hotové :)