2012-08-23 59 views
0

我有PHP级与Facebook API的工作:Facebook登录/注销/检查用户支持PHP-SDK

class Social { 
    private $name; 
    private $context; 
    private $tocken; 

    public function check(){ 
    $this->tocken = $this->context->getAccessToken(); // get current tocken 
    if (isset($_SESSION['fb_tocken']) AND !empty($_SESSION['fb_tocken'])){ 
     // session tocken not null 
     if ($_SESSION['fb_tocken'] == $this->tocken){ 
      // session tocken = current tocken 
      // update last active 
      return true; 
     } elseif ($this->tocken == APPLICATION_TOCKEN) { 
      // current tocken == default tocken 
      $this->logout(); 
     } else { 
      // current tocken <> default tocken 
      $this->logout(); 
     } 
    } else { 
     // session tocken is null 
     if ($this->tocken == APPLICATION_TOCKEN){ 
      // current tocken is default 
      return false; 
     } else { 
      // current tocken is not default 
      if ($this->getUserInfo()){ 
      // user registered - login action 
      if ($this->login()) 
       return true; 
      else 
       return false; 
      } else { 
      // register new user 
      if ($this->register()){ 
       if ($this->login()){ 
        return true; 
       } else 
        return false; 
      } else 
       return false; 
      } 
     } 
    } 
    } 
    // ... 
}; 

如果用户使用alogritm:

1 - 登录了Facebook 2 - 来自Facebook 4注销 - - 在应用 3登录登录facebook中 5 - 开放应用

应用问题:

第五步后我的应用程序无法授权用户。但是如果用户按'刷新',他就会被授权。

+0

@Roddie I'am修改此类,现在它可以工作。但是有一个问题 - IE x - Iframe中没有保存cookie。如何克服这种行为? –

回答

0

这是正确的behviour - 但如果没有代码的其余部分(即抓取令牌的位)不可能确认。

会发生什么情况是当用户注销时,当前令牌(您存储在会话中)变得无效。用户重新登录到Facebook,您需要获得新的令牌,而这不会自动发生 - 但是当您执行刷新时,我认为您的代码getAccessToken()(以上未显示)将获取新令牌。

最简单的解决方法是在Javascript中添加一个监听器用于登录和注销。你可以找到details here,你需要auth.login处理程序。触发后,只需刷新页面即可。

还有其他一些使用Javascript的选项可以将新令牌泵送到可以在幕后更新会话的PHP侦听器。

+0

Robbie $ this-> tocken = $ this-> context-> getAccessToken(); //获取当前的答案 –

+0

事件(auth.login)//不能在Internet Explorer XX中工作...... –

+0

您需要调试剩下的代码然后 - 这在IE中运行得很好,所以您还有其他东西停止运行JavaScript脚本,或者你的刷新指令是错误的。但是我们不能在没有看到代码的情况下多说。 – Robbie