2

我正在尝试迁移到新的Facebook API网站,并且无法使其顺利运行。我想一起使用Javascript和PHP SDK,但遇到问题。我可以进行身份​​验证,但该页面不会自动刷新。Facebook Oauth 2.0使用PHP 3.1.1和Javascript 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> 
+1

我*认为*这是一个错误,请阅读[这里]的评论(http://developers.facebook.com/blog/post/534/?fb_comment_id=fbc_10150280812027726_18008036_10150281567792726)。 – ifaour

回答

4

我打算写这作为注释,但它变得有点长... :)

一对夫妇使用PHP SDK指针:

$facebook->getUser(); 

这无论工作认证。 getUser()获取不需要访问令牌的公共可用数据,但如果您有访问令牌并且用户提供了例如email权限,则此方法还将包含其电子邮件地址。

认证用户一个更好的检验:

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

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

$access = $facebook->getAccessToken(); 

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

现在,你有你有效的访问令牌登录的用户,你可以入手:

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

,或者更加简单:

$user = $facebook->getUser(); 

我倾向于保留更多的API调用复杂的请求,如张贴到用户供稿/朋友供稿。

因此,要回顾:

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

+0

谢谢,大卫。这肯定指出了我的正确方向,因为我认为SDK正在为我照顾这件事。我不知道我需要请求'code'参数!与sdk一起提供的example.php没有提及这个概念...... – HipN

+0

没问题,'code'参数实际上并不是SDK的一部分,它只是通过Facebook的URL传递的。检查它是否存在只是澄清用户已经授权您的应用程序。在Facebook上我完全和你在一起,并没有提到某些“概念”。尽管提供了大量信息,但他们省略了大量非常相关的信息。 –