使用PHP SDK 4.0检查是否已登录Facebook

3
我希望能在导航到index.php时检查是否已登录Facebook,以便自动重定向到主页。
然而,我的代码只会在点击登录链接后才进行检查。
Facebook\FacebookSession::setDefaultApplication(Globals::FB_APP_ID, Globals::FB_APP_SECRET);

$helper = new Facebook\FacebookRedirectLoginHelper("myurl");

try {
        $session = $helper->getSessionFromRedirect();

} catch (FacebookRequestException $ex) {
    // When Facebook returns an error
} catch (Exception $ex) {
    // When validation fails or other local issues
}

// see if we have a session
if (isset($session)) {
    // graph api request for user data
    $request = new FacebookRequest($session, 'GET', '/me');
    $response = $request->execute();
    // get response
    $graphObject = $response->getGraphObject();

    header("location:home.php");
} else {
    // show login url
    echo '<a href="' . $helper->getLoginUrl() . '">Login</a>';
}

我查看了一些关于Facebook PHP SDK的其他帖子,但是关于SDK 4.0的内容不多,也没有适用于我的方法。
我原以为可以在会话中添加令牌,但是如果在第一次访问之前已经登录到Facebook,它将无法工作...如果我从Facebook注销而没有从我的网站注销,这也会导致问题。
1个回答

1
由于我发现这个问题经常被提出但没有答案,所以我决定与社区分享我的做法。
我的代码中的$session变量包含一个访问令牌,可以通过new FacebookSession('token')在任何其他地方重新实例化会话来使用。
考虑到第一次登录时,我从$session中检索令牌并将其存储在$_SESSION中。然后,我创建了一个简单的工具函数,首先检查$_SESSION变量是否设置,然后尝试使用存储的令牌实例化新的FacebookSession。如果令牌无效,则会话不会实例化,然后我可以在我的实用程序函数中检测到它并返回用户是否实际上已登录。
请注意,当Facebook用户注销时,访问令牌将失效。
登录URL+令牌存储:
FacebookSession::setDefaultApplication(Globals::FB_APP_ID, Globals::FB_APP_SECRET);


$helper = new Facebook\FacebookRedirectLoginHelper("http://localhost/PoubellesDeMerde/PoubellesDeMerde/index.php");

try {
        $session = $helper->getSessionFromRedirect();

} catch (FacebookRequestException $ex) {
    // When Facebook returns an error
} catch (Exception $ex) {
    // When validation fails or other local issues 
}

// see if we have a session
if (isset($session)) {
    // graph api request for user data
    $request = new FacebookRequest($session, 'GET', '/me');
    $response = $request->execute();

    $_SESSION['token'] = $session->getToken();
} else {
    // show login url
    echo '<a href="' . $helper->getLoginUrl() . '">Login</a>';
}

实用函数:

public static function isLoggedIn()
{
    $id=0;       
    if(isset($_SESSION['token']))
    {
        $session = new FacebookSession($_SESSION['token']);

        $request = new FacebookRequest($session, 'GET', '/me');
        $response = $request->execute();

        $graphObject = $response->getGraphObject();

        $id = $graphObject->getProperty("id");                        
    } 

    return $id!=0;
}

在使用Util函数时,我遇到了以下错误:致命错误:类“FacebookSession”未在/var/www/html/projects/frameworks/ci/birthdaybucks/application/models/Facebook_model.php的第36行找到。 - codersrb
我喜欢那些控制器。 - Leandro Bardelli

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接