检查Facebook用户是否使用PHP SDK登录到应用程序

时间:2014-08-08 10:13:06

标签: php facebook facebook-login

我有一个使用Facebook登录API的应用程序。我将用户的详细信息存储在我自己的数据库中,并为用户创建自己的用户ID(我还存储了facebook ID)。

下次用户访问我的网站时,我想自动设置会话,而不再让他们重新连接。所以我想获取用户的Facebook ID(如果他已经过身份验证),然后检查我的数据库中是否存在该ID,如果是,那么我设置会话。

这在Javascript SDK中有描述,但Javascript SDK的问题在于,只有在页面刷新后才会访问第一页时用户不会登录(因为在PHP执行后运行Javascript,所以当页面加载时没有设置会话。

所以我想使用PHP SDK来做这个服务器端。

我尝试了以下代码:

public function isUserLoggedIn(){
    $facebook = new Facebook();
    $user = $facebook->facebook->getUser();
    if($user){
        //Use API call for /me which require authentication
        try{
            $me = $facebook->facebook->api('/me');
            //If id_facebook exist, then set logged in session to user id
            if($me){
                $stmt = $GLOBALS['link']->prepare('SELECT * FROM users WHERE id_facebook=:id_facebook');
                $stmt->execute(array('id_facebook' => $me['id']));
                if($row = $stmt->fetch()){
                    $_SESSION['uid'] = $row['id'];
                }
            }
        } catch (FacebookApiException $e) {
            $user = null;
            //User is not logged in
        }
    }
}

此代码仅在Javascript SDK已经对用户进行身份验证并且他已登录时才会通过。它无法正常工作。

所以:

  • 如何使用PHP SDK检查用户是否通过我的应用进行了身份验证?

  • 我可以自己设置$ _COOKIE,是这样做的吗?我认为有一种使用SDK / API的“官方”方式,因为有Javascript SDK。

1 个答案:

答案 0 :(得分:2)

我觉得我有点晚了,但这是我的两分钱:

我使用facebook登录SO。事实上,有一天,大约一天后,我登陆这个网站,一两秒后,一个小弹出窗口告诉我,我已登录并刷新页面。这不是一个真正的问题,我只是重新加载页面,我很高兴。这就是你所指的。

但是请记住,如果您只检查会话以检索用户的ID和Facebook数据,当用户从Facebook(或从您的应用程序)退出时可能会导致问题:您的会话与Facebook不是最新的。

这就是使用Javascript SDK登录的原因应该更好。

我今天做了很多测试和试验,以了解整个过程是如何工作的(主要是因为我遇到了很多错误或不完整的信息,这些信息都是由很多“教程”给出的)。有效的版本是从Facebook guide to PHP SDK完全复制/粘贴的版本。假设已经配置了Javascript SDK,我打开了index.php页面并开始使用SDK:

//autoload is needed to include all sdk classes (not needed using Composer)
require_once ('./inc-fb-sdk/autoload.php');

然后,我必须明确告诉SDK加载一些包含的类;这需要使用这些类:

use Facebook\FacebookJavaScriptLoginHelper;
use Facebook\FacebookRedirectLoginHelper;
use Facebook\FacebookRequest;
use Facebook\FacebookResponse;
use Facebook\FacebookSDKException;
use Facebook\FacebookSession;
use Facebook\FacebookRequestException;
use Facebook\GraphObject; 
use Facebook\GraphUser;

当然,我们初始化PHP SDK创建对象(使用以下行中的AppID和AppSecret):

FacebookSession::setDefaultApplication('App_id', 'App_secret');

最后,这是指南中的代码,带有一些添加的注释和回声,以显示用户是否已登录:

//create object that is used to check login
$helper = new FacebookRedirectLoginHelper();
try {
  $session = $helper->getSessionFromRedirect();
} catch(FacebookRequestException $ex) {
  // When Facebook returns an error
} catch(\Exception $ex) {
  // When validation fails or other local issues
}

//show if the user is logged in or not
if ($session) {
  // Logged in
  echo ('User is logged in');
} else {
  echo ('User is not logged in');
}

由于您已经在使用Login API,因此您只需在facebook中测试登录/注销,然后刷新页面,以查看可能发生的各种情况。

这应该回答你帖子末尾的两个问题。

希望这有帮助。