2

我有一个(目前非常简单的)网站,该网站正在使用 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

4

2 回答 2

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 用户已登录,因此不会设置重定向会话变量,并且如果用户返回首页,则主页不会奇怪地重定向,因为再次未设置重定向会话变量。

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

于 2012-06-21T04:11:32.080 回答
0

从数组 $param(this one -> redirect_uri) 中删除重定向 url 条目。仅当您希望在其他页面上重定向时才使用此选项。如果您想在同一页面上重定向,则无需提及,它会在登录后自动返回。

这是没有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>
于 2012-06-19T16:10:57.980 回答