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 页面数据(应用程序)获取到我的 android 应用程序中?