$ facebook-> getSession()在示例代码中返回null。这可以吗?

时间:2010-05-10 17:21:15

标签: php facebook

运行example code for the Facebook API我得到一个空会话对象,我应该得到一个非空对象,在代码中给出注释。 我做错了什么?

换句话说,在我的index.php中,当我在浏览器中转到http://apps.facebook.com/my_app时,示例代码中的这个片段显示“no session”

<?php

require './facebook.php';

// Create our Application instance.
$facebook = new Facebook(array(
  'appId' => '...', // actual value replaced by '...' for this post
  'secret' => '...', // actual value replaced by '...' for the post
  'cookie' => true,
));

// We may or may not have this data based on a $_GET or $_COOKIE based session.
//
// If we get a session here, it means we found a correctly signed session using
// the Application Secret only Facebook and the Application know. We dont know
// if it is still valid until we make an API call using the session. A session
// can become invalid if it has already expired (should not be getting the
// session back in this case) or if the user logged out of Facebook.
$session = $facebook->getSession();

if ($session) {
  echo "session ok";
}
else {
  echo "no session";
}


?>

注意:在我的服务器中,index.php和facebook.php在同一个文件夹中。

3 个答案:

答案 0 :(得分:3)

您是否已关联您的应用程序?

if ($session) {
  $logoutUrl = $facebook->getLogoutUrl();
} else {
  $loginUrl = $facebook->getLoginUrl();
}
 <?php if ($me): ?>
<a href="<?php echo $logoutUrl; ?>">
<img src="http://static.ak.fbcdn.net/rsrc.php/z2Y31/hash/cxrz4k7j.gif">
</a>
<?php else: ?>
<div>
Using JavaScript &amp; XFBML: <fb:login-button></fb:login-button>
</div>
<div>
Without using JavaScript &amp; XFBML:
<a href="<?php echo $loginUrl; ?>">
<img src="http://static.ak.fbcdn.net/rsrc.php/zB6N8/hash/4li2k73z.gif">
</a>
</div>
<?php endif ?>

从您提供的链接中获取的代码。

答案 1 :(得分:3)

请查看http://forum.developers.facebook.net/viewtopic.php?pid=267627

上的第8篇文章

它对我有用。谢谢用户“standardcombo”。

为方便起见,我将其复制到此处。

  1. 转到您的开发者页面“我的应用程序”
  2. 选择您的应用和“修改设置”
  3. 高级&gt;迁移&gt;启用“OAuth 2.0 for Canvas(测试版)”

答案 2 :(得分:1)

我不确定你是否已经得到了这个答案,但这是我自己完成的工作。即使用户登录到Facebook,第一次尝试获取会话时也会为空。我发现的示例应用程序在表单上放置了一个登录按钮 - 如果你这样做,那么用户必须点击按钮,即使他们已经登录到Facebook。它们不会再次被提示,但这是一个额外的用户操作。

因此,在我的应用程序中,以及在论坛中找到的其他几个用户只是重定向到登录URL。 (如果你检查了url,它的一个参数是“return_session = 1”。)当它返回时,你将有一个会话并且可以正常进行。

但是在我的应用程序中,如果我没有应用程序令牌,那么我也无法获得该会话,因此我必须先获取应用程序令牌。要获得应用程序令牌,请查看来自http://forum.developers.facebook.com/viewtopic.php?id=56789的优秀描述,2010年5月7日来自dynamoman的帖子(关于第四篇文章)。

我遇到的一件事是无论我在哪里告诉身份验证是“下一页”,它都会转到画布中配置的页面。因此,我只有两个,而不是三个单独的页面,并且画布回调URL必须处理它所处的任何状态。

我的实际代码在框架内,因此不能直接应用;作为算法,它是:

landing page:
    if the facebook api token is not loaded,
        redirect to the authorization url
    try to load the user id // to validate that the session
    if the user id is not loaded,
        redirect to the loginurl from the facebook api
    // if it reaches here, then we have both an api token and a session

authorization page:
    get authorization token // see the post for how to do that
    redirect back to the page configured as the canvas url

可能有一种更好的方法,我相信比我更熟悉的人可以有更好的解决方案,或者发布通用代码。