Facebook登录:如何将JavaScript与PHP SDK相结合


Facebook Login: How to combine JavaScript with 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 = $facebook->getUser();

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

我不是CCD_ 1的铁杆粉丝,因为它会导致浏览器加载不同的页面(facebook登录),然后重定向回web应用程序。如果我能加载一个弹出框供用户登录,然后透明地重定向回我的网络应用程序,那就更理想了。因此,任何关于如何实现这种用户体验的建议都将不胜感激。非常感谢。

不确定是否能正常工作。当前的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/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。

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

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

经过长时间的搜索,我发现这解决了PHP SDK无法接收Facebook会话的问题。显然,Javascript SDK没有以正确的方式设置会话。将此添加到您的auth.login事件侦听器:

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

此外,请确保将应用程序域设置为与您的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();
    }
}

没必要乱弄饼干!