Facebook登录不在非主页上工作

时间:2012-06-17 23:00:04

标签: php facebook api oauth

我有一个(目前非常简单)网站正在使用Facebook的“Facebook登录网站”应用程序设置。从表面上看,我的问题看起来很简单,但是我无法解决这个问题,是否有人可以解决问题呢?

我的网站主页是(比方说)https://www.mysite.net/   - 当我使用下面的代码从这里登录时,它可以工作。

if(!$this->facebook->getUser())
    {
        //NOT LOGGED IN 
       $params = array(
          'scope' => 'email, publish_stream, user_photos, status_update',
          'redirect_uri' => current_url(),
        );  
        $auth_url = $this->facebook->getLoginUrl($params);  
        $auth_text = "Log In";
    } 
    else 
    {
        //LOGGED IN         
        $fbid = $this->facebook->getUser();
        $fbid = $fbid;
        $auth_url = "https://www.facebook.com/logout.php?confirm=1&next=".urlencode(base_url().'logout/')."&access_token=".$this->facebook->getAccessToken();
        $auth_text = "Log Out";
    }

<a href="<?=$auth_url;?>" class="btn btn-primary"><i class="icon-user"></i> <?=$auth_text;?></a>

..工作正常。

然而,当我使用相同的代码(并且用户需要登录)来说https://www.mysite.net/second_page/时,我也在第二页上使用上面的确切代码,登录脚本重定向到Facebook Auth Dialog (很好),并重定向到redirect_uri(也很棒),但是用户没有登录到页面 - 也就是说,它提供了“登录”对话框而不是预期的“注销”对话框。

我在这里做错了吗?我希望facebook登录对话框可以从我的应用程序指定的站点根目录中的任何页面开始工作。我不想在每次登录时将我的用户重定向到主页,他们需要能够从网站的任何页面登录。

思想?

此致 保罗G

2 个答案:

答案 0 :(得分:1)

我已经实施了一种解决方法。在不是基本URL的页面上,我让它们在会话变量中引用它们,如下所示:

if(!$this->facebook->getUser())
{
  // Set a session var <---
  $_SESSION['redirect_state'] = current_url();
  //NOT LOGGED IN 
   $params = array(
      'scope' => 'email, publish_stream, user_photos, status_update',
      'redirect_uri' => base_url(), // <-- Changed this back to base url.
    );  
    $auth_url = $this->facebook->getLoginUrl($params);  
    $auth_text = "Log In";
} 
else 
{
    //LOGGED IN         
    $fbid = $this->facebook->getUser();
    $fbid = $fbid;
    $auth_url = "https://www.facebook.com/logout.php?confirm=1&next=".urlencode(base_url().'logout/')."&access_token=".$this->facebook->getAccessToken();
    $auth_text = "Log Out";
}

<a href="<?=$auth_url;?>" class="btn btn-primary"><i class="icon-user"></i> <?=$auth_text;?></a>

然后,登录脚本将重定向到应用程序的基本URL。在基本URL中,我放置了一些代码检查是否存在$ _SESSION ['redirect_state'],然后将其删除,然后重定向:

// Is this a redirect from a another page's login?
    if((isset($_SESSION['redirect_state'])))
    {
        $redir_page = $_SESSION['redirect_state'];  
        unset($_SESSION['redirect_state']);
        redirect($redir_page);
        exit;
    }

用户现在被重定向回他们登录的页面。由于FB用户已登录,因此不会设置重定向会话变量,如果用户回家,主页将不会重定向,因为再次未设置重定向会话变量。

我希望这有助于其他人。我很惊讶我没有发现其他人也在谈论这个问题:)

答案 1 :(得分:0)

从数组$ param中移除重定向网址条目(此一个 - &gt; redirect_uri)。 仅当您希望在其他页面上重定向时才使用此选项..如果您想在同一页面上重定向,则无需提及它,它将在登录后自动返回。

这里是相同的代码,没有redirect_uri ...

if(!$this->facebook->getUser())
    {
        //NOT LOGGED IN 
       $params = array(
          'scope' => 'email, publish_stream, user_photos, status_update'
         );  
        $auth_url = $this->facebook->getLoginUrl($params);  
        $auth_text = "Log In";
    } `enter code here`
    else 
    {
        //LOGGED IN         
        $fbid = $this->facebook->getUser();
        $fbid = $fbid;
        $auth_url = "https://www.facebook.com/logout.php?confirm=1&next=".urlencode(base_url().'logout/')."&access_token=".$this->facebook->getAccessToken();
        $auth_text = "Log Out";
    }

<a href="<?=$auth_url;?>" class="btn btn-primary"><i class="icon-user"></i> <?=$auth_text;?></a>