Facebook SDK - 使用JS来验证Auth和PHP吗?

时间:2012-12-22 19:59:26

标签: facebook facebook-javascript-sdk facebook-php-sdk facebook-oauth

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

我阅读并发现使用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?

1 个答案:

答案 0 :(得分:0)

已签名的请求保存在类似于fbsr_appid的Cookie中。从那里你可以使用code来处理它。以下是您的流程应该如何

Auth Hybrid Flow

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