2

我正在尝试迁移到用于网站的新 Facebook API,但无法使其顺利运行。我想同时使用 Javascript 和 PHP SDK,但遇到了问题。我可以进行身份​​验证,但页面不会自动刷新。

我已经搜索了整个 SO 和 Facebook 文档,但仍然无法使其正常工作。我已经阅读了http://developers.facebook.com/blog/post/534/,下载了最新的 PHP SDK (3.1.1),并且基本上从 facebook 复制了上述帖子中的示例。我在我的应用程序“迁移”设置中进行了我认为正确的设置,但这可能是问题所在。我不能发布图片,所以这里是设置:

  • 删除已弃用的 API:已启用
  • 强制使用登录密码:启用
  • 加密访问令牌:已启用
  • 增强的身份验证对话框:已启用
  • (其他一切都被禁用)

这是代码:

<?php

require 'php-sdk/src/facebook.php';

$facebook = new Facebook(array(
  'appId'  => 'YOUR_APP_ID',
  'secret' => 'YOUR_APP_SECRET',
));

// See if there is a user from a cookie
$user = $facebook->getUser();

if ($user) {
  try {
  // Proceed knowing you have a logged in user who's authenticated.
  $user_profile = $facebook->api('/me');
} catch (FacebookApiException $e) {
  echo '<pre>'.htmlspecialchars(print_r($e, true)).'</pre>';
  $user = null;
  }
}

?>
<!DOCTYPE html>
<html xmlns:fb="http://www.facebook.com/2008/fbml">
  <body>
    <?php if ($user_profile) { ?>
      Your user profile is 
      <pre>            
         <?php print htmlspecialchars(print_r($user_profile, true)) ?>
      </pre> 
    <?php } else { ?>
      <fb:login-button></fb:login-button>
    <?php } ?>
    <div id="fb-root"></div>
    <script>               
      window.fbAsyncInit = function() {
         FB.init({
           appId: '<?php echo $facebook->getAppID() ?>', 
           cookie: true, 
           xfbml: true,
           oauth: true
         });
        FB.Event.subscribe('auth.login', function(response) {
          window.location.reload();
        });
        FB.Event.subscribe('auth.logout', function(response) {
          window.location.reload();
        });
       };
      (function() {
        var e = document.createElement('script'); e.async = true;
        e.src = document.location.protocol +
          '//connect.facebook.net/en_US/all.js';
          document.getElementById('fb-root').appendChild(e);
      }());
    </script>
  </body>
</html>
4

1 回答 1

4

我打算写这个作为评论,但它有点长...... :)

使用 PHP SDK 的几个指针:

$facebook->getUser(); 

无论身份验证如何,这都将起作用。getUser() 提取不需要访问令牌的公开可用数据,但是,如果您确实拥有访问令牌并且用户已提供email权限,例如,此方法还将包含他们的电子邮件地址。

对经过身份验证的用户的更好测试:

$code = $_REQUEST['code'] ? true : false;
if (!$code) {
    echo ("<script>window.top.location=\"...\"</script>");
}

将检查用户是否已授权您的应用。

$access = $facebook->getAccessToken();

确保您始终请求访问令牌(优先级!)当您从 facebook 对话重定向到您的应用程序时,您只会收到签名请求。(ie) oAUTH 对话。SDK 的这种方法还将您的访问令牌保存到会话变量中。即使没有发出签名请求,您也可以在 PHP 会话处于活动状态的任何后续应用程序页面上调用 getAccessToken() 方法。

现在您已经获得了登录用户的有效访问令牌,您可以继续:

$user = $facebook->api('/me');

或者,更简单:

$user = $facebook->getUser();

我倾向于为更复杂的请求保留 API 调用,例如发布到用户提要/朋友提要。

回顾一下:

-> 检查$code -> 在 oAuth 对话后的第一页上获取签名请求。-> 如果浏览器 cookie 被禁用(可能在 ie 中),不要忘记将会话传递到具有 SID 常量的下一页。如果不这样做,您将丢失存储的访问令牌(不好!)。

于 2011-10-24T20:00:59.293 回答