1

我正在尝试同时使用 Facebook PHP 和 JS SDK,以创建一个可以兼作画布应用的 Web 应用。在当前设置中,当页面离开或一段时间并且系统恢复到登录屏幕时,我遇到了问题。重要的是,我没有使用动态域映射器,并且有一些可能的 URL /dev/、/dev/pool/、/dev/pool/edit/ 等,用户可能会访问和体验应用程序。

我四处阅读,发现使用 JS SDK 授权是正确的方法(我可能错了吗?),然后使用 PHP SDK 对其他所有内容进行排序就可以找到,自然地获得访问令牌。

我知道这是我的身份验证设置有问题,因为我有时会看到它重新加载,如果我在子页面上并且如果我不触摸该网站几分钟后,系统会无缘无故地尝试重新验证。

关于我做错了什么的任何想法?谢谢!

这是我网站上设置的 JS:

<div id="fb-root"></div>
<script>
  window.fbAsyncInit = function() {
    FB.init({
      appId: 'XXXXX',
      channelUrl: 'http://www.domain.com/channel.php',
      status: true,
      cookie: true,
      xfbml: true,
      oauth: true,
    });
    FB.Event.subscribe('auth.login', function(response) {
      alert('refreshing')
      window.location.reload();
    });
    FB.Event.subscribe('auth.logout', function(response) {
      window.location.reload();
    });
    FB.Canvas.setSize({ width: 810 });
    FB.Canvas.setAutoGrow();

  };

  (function(d, debug){
     var js, id = 'facebook-jssdk', ref = d.getElementsByTagName('script')[0]
     if (d.getElementById(id)) {return;}
     js = d.createElement('script'); js.id = id; js.async = true;
     js.src = "//connect.facebook.net/en_US/all" + (debug ? "/debug" : "") + ".js";
     ref.parentNode.insertBefore(js, ref);
   }(document, /*debug*/ true));
</script>

这是调用 Facebook 对象的 PHP 流程

$fb = new FbDoa();
if ($fb->isAuthed() === false) {
  echo $fb->getLoginButton();
}
else {
  echo $fb->getProfileInfo();
}

这是 FbDoa 对象 ( $fb) 的 PHP 内容:

public function __construct() {
  require_once(Facebook/facebook.php');
  $this->facebook = new Facebook(array(
    'appId'  => 'XXXXX',
    'secret' => 'XXXXXXXXXX', 
    'cookie' => true,
  ));

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

public function isAuthed() {
  if ($this->user) {
    return true;
  }
  else {
    return false;
  }
}

public function getLoginButton() {
  $scope = 'email,user_likes,friends_likes,publish_actions,publish_stream,read_friendlists';
  return '<fb:login-button size="xlarge" perms="'.$scope.'"></fb:login-button>';
} 

public function getProfileInfo() {
  return $this->user_profile;
}


更新 1: 真的好像window.location.reload();什么都没做,如果我一遍又一遍地点击登录按钮,什么也没有发生,但我刷新它就可以了。确实,应用程序的身份验证应该持续超过几分钟,这意味着我面前有一些问题。有任何想法吗?

更新 2:问题可能与我的服务器端代码有关?有人知道PHP+JS SDK吗?

4

1 回答 1

0

签名的请求保存在类似于 的 cookie 中fbsr_appid。从那你可以使用code来处理它。这是您的流程的外观

验证混合流

只要您的应用设置中有一个基本网址,它就应该重定向到所有网址。

于 2012-12-22T20:09:27.507 回答