Login do Facebook: Como combinar o JavaScript com o SDK do PHP?

Como faço para combinar exemplos de ambos

https://github.com/facebook/php-sdk/blob/master/examples/example.php e https://github.com/facebook/connect-js/blob/master/examples/jquery/login.html

O objective final é para que possamos usar jQuery para iniciar session, e de alguma forma a seguinte linha ainda funcionaria

$user = https://stackoverflow.com/questions/6147631/facebook-login-how-to-combine-javascript-with-php-sdk/$facebook->getUser(); 

O que eu aviso atualmente é que, quando eu entrar com JavaScript, não configura a session com o PHP, portanto, é incompatível com o SDK baseado em PHP (então $ usuário neste caso ainda seria nulo)

Eu não sou um grande fã de getLoginUrl()">Login with Facebook , porque faz com que o navegador carregue uma página diferente (o login no Facebook) e redireciona novamente para o aplicativo web. É muito mais ideal se eu puder carregar uma checkbox popup para que o usuário assine e, de forma transparente, redireciona de volta para o meu aplicativo da Web. Então, todas as sugestões sobre como posso implementar essa experiência do usuário seriam muito apreciadas. Obrigado!

Eu apenas uso o botão de login do Facebook – https://developers.facebook.com/docs/reference/plugins/login/

Uma vez que o usuário usou isso para fazer login (se eles ainda não estivessem) e conceder access à sua aplicação (site), o PHP-SDK não deveria ter problemas para usar a session do Facebook e as APIs.

Atualizar

Acabei de tentar isso com a nova versão 3.0 PHP SDK e definitivamente não está funcionando. Encontrou isso no blog do desenvolvedor

Se você estiver usando o JavaScript SDK para login em conjunto com o SDK do PHP, você vai querer aguardar a atualização do SDK do JavaScript (chegando em 4 semanas). A versão 3.0.0 do SDK do PHP não cooperará com o SDK de JavaScript atual devido à alteração do formato de cookie.

Em outras palavras, use o SDK do PHP v2 até o JS SDK ser atualizado.

Não tenho certeza se você trabalhou. A API JS atual tem uma configuração para salvar o cookie para que o servidor possa lê-lo:

 FB.init({ appId : 'YOUR APP ID', cookie : true }); 

Agora, no PHP, você pode fazer o seguinte para usar a session do JS:

 // Read the cookie created by the JS API $cookie = preg_replace("/^\"|\"$/i", "", $_COOKIE['fbs_' . FB_APP_ID]); parse_str($cookie, $data); // Startup the Facebook object $fb = new Facebook(array( 'appId' => FB_APP_ID, 'secret' => FB_APP_SECRET )); // Say we are using the token from the JS $fb->setAccessToken($data['access_token']); // It should work now var_dump($fb->getUser()); 

Espero que tenha ajudado.

Parece que o Facebook não corrigiu esse problema no momento certo (à medida que eles falam https://developers.facebook.com/blog/post/503 ).

Esta é a informação mais recente sobre js sdk https://developers.facebook.com/blog/post/525/

Após longas horas de busca, encontrei isso corrigi o meu problema onde o SDK do PHP não pegou a session do Facebook. Aparentemente, o SDK do Javascript não está configurando a session do jeito certo. Adicione isso ao seu auth.login eventlistener:

 FB.Event.subscribe('auth.login', function(response) { FB._oauth = false; FB.Cookie.setEnabled(true); FB.Auth.setSession(response.authResponse, response.status); FB._oauth = true; window.location.reload(); }); 

Além disso, certifique-se de configurar o Domínio do aplicativo para corresponder ao seu domínio de cookies. Depois de corrigir esses itens, ele finalmente funcionou.

Edit: Esta manhã, tudo estava funcionando bem. Quando eu estava testando mais um pouco agora, descobri que eu tinha que editar base_facebook.php para garantir que os pedidos para o Facebook não fossem desacelerados. O meu palpite é que, porque estou testando na minha máquina local, a conexão não seria suficientemente rápida para chegar a tempo. Isso explica o comportamento estranho em que às vezes ele e às vezes não funcionaria.

Altere o tempo de conexão na matriz $ CURL_OPTS na linha 128:

 public static $CURL_OPTS = array( CURLOPT_CONNECTTIMEOUT => 20, CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 60, CURLOPT_USERAGENT => 'facebook-php-3.1', ); 

Na versão 4 do SDK, ele funciona automaticamente com o SDK do JavaScript. Você só precisa usar o FacebookJavaScriptLoginHelper :

 $helper = new FacebookJavaScriptLoginHelper(); // Get access token from JS SDK try { $session = $helper->getSession(); } catch(FacebookRequestException $e) { // When Facebook returns an error echo "Exception occured, code: " . $e->getCode(); echo " with message: " . $e->getMessage(); } catch(\Exception $e) { // When validation fails or other local issues echo "Exception occured, code: " . $e->getCode(); echo " with message: " . $e->getMessage(); } // If logged in if($session) { // Get user profile try { $user_profile = (new FacebookRequest( $session, 'GET', '/me' ))->execute()->getGraphObject(GraphUser::className()); print_r($user_profile); } catch(FacebookRequestException $e) { echo "Exception occured, code: " . $e->getCode(); echo " with message: " . $e->getMessage(); } } 

Não é necessário mexer com cookies!