Facebook登录:如何将JavaScript与PHP SDK结合起来?

我如何结合两者的例子

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

最终目标是我们可以使用jQuery登录,不知何故,以下行仍然有效

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

我目前注意到的是,当我使用JavaScript登录时,它不会使用PHP设置会话,因此,它与基于PHP的SDK不兼容(因此在这种情况下$ user仍然为null)

我不是getLoginUrl()">Login with Facebook忠实粉丝,因为它会导致浏览器加载不同的页面(Facebook登录),然后重定向回到网络应用。 如果我可以加载弹出框供用户登录,然后透明地重定向回我的网络应用程序,那就更理想了。 因此,我们将非常感谢有关如何实施此用户体验的任何建议。 谢谢!

我只是使用Facebook登录按钮 – https://developers.facebook.com/docs/reference/plugins/login/

一旦用户使用该登录(如果他们还没有)并授予对您的应用程序(站点)的访问权限,PHP-SDK应该没有使用Facebook会话和API。

更新

我只是尝试使用新版本3.0 PHP SDK,它肯定无法正常工作。 在开发者博客上找到了这个

如果您使用JavaScript SDK与PHP SDK一起登录,则需要等待JavaScript SDK升级(即将在4周内完成)。 由于cookie格式的改变,PHP SDK 3.0.0版本不会与当前的JavaScript SDK配合使用。

换句话说,在更新JS SDK之前使用v2 PHP SDK。

不确定你是否有这个工作。 当前的JS API具有保存cookie的配置,因此服务器可以读取它:

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

现在,在PHP中,您可以执行以下操作来使用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()); 

希望它有所帮助。

这听起来像facebook并没有在正确的时间解决这个问题(因为他们谈论https://developers.facebook.com/blog/post/503 )。

这是关于js sdk https://developers.facebook.com/blog/post/525/的最新信息

经过长时间的搜索,我发现这解决了我的问题,PHP SDK没有拿起Facebook会话。 显然,Javascript SDK没有以正确的方式设置会话。 将此添加到您的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(); }); 

此外,请确保将App Domain设置为与您的Cookie域匹配。 修好这些物品后,它终于奏效了。

编辑:今天早上,一切正常。 当我刚刚测试更多时,我发现我必须编辑base_facebook.php以确保对Facebook的请求不会超时。 我的猜测是因为我在我的本地机器上进行测试,连接速度不够快,无法及时完成。 这解释了奇怪的行为,有时它会,有时它不会起作用。

更改第128行的$ CURL_OPTS数组中的connecttimeout:

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

在SDK的第4版中,它可以自动使用JavaScript SDK。 您只需要使用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(); } } 

无需乱搞cookies!