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

Posted

技术标签:

【中文标题】Facebook 登录:如何将 JavaScript 与 PHP SDK 结合起来?【英文标题】:Facebook Login: How to combine JavaScript with PHP SDK? 【发布时间】:2011-09-03 02:35:26 【问题描述】:

如何将两者的示例结合起来

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 仍然为空)

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

【问题讨论】:

我也有同样的问题。你弄明白了吗? @Daniel 查看我的更新答案 使用最新的 api 你不需要做任何事情。只要确保 cookie 处于打开状态,php SDK 就可以工作。 【参考方案1】:

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

希望对您有所帮助。

【讨论】:

它对我有用,但我必须使用 $_COOKIE['fbm_' 。 FB_APP_ID ] 非常感谢。 你甚至不需要再做所有 preg_replace 的事情了。 getUser() 将脱离盒子 除此之外,cookie 上的域必须是正确的 - 这对我来说意味着 fb 应用程序设置 > 应用程序域需要使用裸域名:example.com 而不是 www .example.com。这可能仅适用于我有多个子域(www、sales.example.com 等)的情况。【参考方案2】:

我只使用 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 周后)。 PHP SDK 3.0.0 版本由于 cookie 格式的变化,将无法与当前的 JavaScript SDK 配合。

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

【讨论】:

实际上,我昨天花了很长时间试图让您的建议生效,但没有成功。我修改了 PHP SDK 中的示例,如pastebin.com/fy2SRLWM 所示,即使我已登录(fb:login-button 会显示我已登录),它也不会设置 PHP 会话。在我的应用设置中,siteUrl 是 localhost 用于本地测试 @Antony 你是完全正确的。 PHP SDK 似乎不再能够通过 JavaScript SDK 访问 cookie 集。最重要的是,我无法使用getLogoutUrl() 方法注销 谢谢菲尔。我回到这个页面评论说我刚刚在博客上阅读了那个 sn-p。在过去的八个小时里,我一直在扯头发,试图弄清楚这一点!哦,好吧... @Daniel 问题是所有示例都让您克隆/下载主分支。在 JS SDK 赶上之前,他们应该真正将 v3 分支标记为测试版 谢谢菲尔!我降级到 v2,现在它可以工作了!在旁注中,如果 v2 的任何人由于对 localhost 进行测试而遇到证书问题,请参阅github.com/facebook/php-sdk/issues/79 以获取解决方案。【参考方案3】:

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

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

【讨论】:

【参考方案4】:

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

另外,请确保您设置应用程序域以匹配您的 cookie 域。修好这些东西后,终于奏效了。

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

在第 128 行更改 $CURL_OPTS 数组中的连接超时:

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

【讨论】:

【参考方案5】:

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

无需乱用 cookie!

【讨论】:

以上是关于Facebook 登录:如何将 JavaScript 与 PHP SDK 结合起来?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Facebook 集成到 WordPress 注册/登录中?

如何使用 Firebase 统一创建 Facebook 登录?

如何通过本机Facebook授权登录Facebook?

如何将特定登录的公共 Facebook 页面数据(应用程序)获取到我的 android 应用程序中?

用户登录后如何使用社交 API(如 facebook)将数据存储在数据库中

如何将 Facebook 登录作为 Android 库并使该库可用于其他 Android 应用程序