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

时间:2011-05-27 03:44:38

标签: php javascript jquery facebook

如何组合两者的示例

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

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

$user = $facebook->getUser();

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

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

5 个答案:

答案 0 :(得分:15)

不确定你是否有这个工作。当前的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());

希望它有所帮助。

答案 1 :(得分:12)

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

一旦用户使用该登录(如果他们尚未登录)并授予对您的应用程序(网站)的访问权限,PHP-SDK应该可以毫无困难地使用Facebook会话和API。

更新

我刚尝试使用新版本的3.0 PHP SDK,它肯定是正常工作。在developer blog

上找到了这个
  

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

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

经过长时间的搜索,我发现这解决了我的问题,即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',
);

答案 4 :(得分:0)

在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();
    }
}

无需乱搞饼干!