无论用户是通过 facebook connect 还是我自己的表单登录,如何开始会话?

Posted

技术标签:

【中文标题】无论用户是通过 facebook connect 还是我自己的表单登录,如何开始会话?【英文标题】:How to start session whether user is logged in via facebook connect or my own form? 【发布时间】:2012-12-10 08:59:40 【问题描述】:

我提供了两个登录/注册选项:facebook 连接和我自己的登录/注册表单。

无论用户使用 fb connect 还是我的表单,我都希望在用户登录后将他们带到同一页面。

我可以让它为一个或另一个工作。因此,如果用户通过 fb connect 登录,他们会转到带有此内容的页面,例如:

//$_SESSION['user'] seems to be the facebook session. 
if(!isset($_SESSION['user']))  
   echo "sorry"; 
 else  
   include"myconfig.php";
   $email = GetSQLValueString($_SESSION['user'], "text");
   //The email from fb has already been inserted into my mysql users table...
   $query = sprintf("SELECT * FROM users WHERE user_email = %s",$email);
   $res = mysql_query($query) or die(mysql_error());
   $row = mysql_fetch_array($res);
   echo($row['user_name']);
   echo "<b>   EMAIL : </b>" . $row['user_email'];
               

而且一切正常。但是,如果用户使用我的表单登录,我如何设置另一个会话和 fb 会话?我什至不知道从哪里开始,因为我无法掌握逻辑。我想说:“如果用户已通过 fb 登录,则显示用户表中包含其电子邮件的行中的内容,或者如果他已通过我的表单登录,则也显示该内容。”我是否应该为每个页面设置两个版本,一个用于 fb 用户,另一个用于我的表单用户?

我在其他任何地方都找不到这个问题,所以我认为解决方案非常简单,以至于我是唯一一个愚蠢到无法得到它的人。

【问题讨论】:

我的回答有帮助吗?我不确定这个问题现在的位置。 【参考方案1】:

我不确定您是如何让他们登录 facebook,但就个人而言,我使用的是:

if ($fbinfo['facebook_app_id']) 
    // Create our Application instance (replace this with your appId and secret).
    $facebook = new Facebook(array(
        'appId'  => $fbinfo['facebook_app_id'],
        'secret' => $fbinfo['facebook_app_secret'],
    ));

    // Get User ID
    $user = $facebook->getUser();

    // Login or logout url will be needed depending on current user state.
    if ($user) 
        $logoutUrl = $facebook->getLogoutUrl();

        if (!$_SESSION['extened_fb_token']) 
            // ask for the extended token and get it from session ...
            $facebook->setExtendedAccessToken();
            $access_token = $_SESSION["fb_".FB_APP_ID."_access_token"];
            // now set it into the facebook object ....
            $facebook->setAccessToken($access_token);
            // now our fb object will use the new token as usual ...
            setCompanyFacebookExtendedToken($facebook->getAccessToken());
        

        //print_r($_SESSION);
        //print_r(facebookGetUserPages($user));
        //echo $_SESSION['extened_fb_token'];
     else 
        $loginUrl = $facebook->getLoginUrl(array('scope'=>'manage_pages,publish_stream'));
    

有了这个,我已经对数据库进行了查询以找出应用程序密钥是什么(因为我的数据库中有“公司”,每个人都可以为他们的用户拥有自己的 fb 应用程序)。使用他们的信息,我使用 facebook api 来确定他们是否登录。如果不是,我会生成登录 url。一旦他们登录,$user 包含他们的 facebook 用户 ID,然后可以在我自己的数据库中查询它以找出它实际上是哪个用户。在 $user 为真的 if 语句中,我可以进行 db 调用,提取该用户的电子邮件地址并将其分配给我自己的 $_SESSION['user'] 变量。所以对你来说,它可能看起来像:

if (isset($_POST)) 
    //Handle your post normally here
else
    if ($fbinfo['facebook_app_id']) 
        // Create our Application instance (replace this with your appId and secret).
        $facebook = new Facebook(array(
            'appId'  => $fbinfo['facebook_app_id'],
            'secret' => $fbinfo['facebook_app_secret'],
        ));

        // Get User ID
        $user = $facebook->getUser();

        // Login or logout url will be needed depending on current user state.
        if ($user) 
            $logoutUrl = $facebook->getLogoutUrl();

            //This is just getting an extended token that is good for 60 days
            if (!$_SESSION['extened_fb_token']) 
                // ask for the extended token and get it from session ...
                $facebook->setExtendedAccessToken();
                $access_token = $_SESSION["fb_".FB_APP_ID."_access_token"];
                // now set it into the facebook object ....
                $facebook->setAccessToken($access_token);
                // now our fb object will use the new token as usual ...
                setCompanyFacebookExtendedToken($facebook->getAccessToken());
            

            include"myconfig.php";

            //The email from fb has already been inserted into my mysql users table...
            $query = sprintf("SELECT * FROM users WHERE fb_id = %s",$user);
            $res = mysql_query($query) or die(mysql_error());
            $row = mysql_fetch_array($res);
            echo($row['user_name']);
            echo "<b>   EMAIL : </b>" . $row['user_email'];
                $_SESSION['user'] = $row['user_email'];
         else 
            $loginUrl = $facebook->getLoginUrl(array('scope'=>'manage_pages,publish_stream'));
        
    

编辑 对不起,我猜这并没有完全回答你的问题。您实际上可以重命名您自己的用户会话变量,或者一旦他们使用 facebook 登录,从 facebook 获取您需要的数据然后覆盖他们的会话变量(基本上将他们从 facebook 中注销,但您已经获得了您需要的数据脸书反正)。真的,我认为这是让他们登录 facebook 所需的全部令牌,尽管它可能会导致用户会话变量在页面加载时被覆盖,因此您需要完全删除 facebook 会话,或者只是重命名您的会话变量。

(我还是 facebook api 的新手,所以我希望这是有道理的。)

【讨论】:

谢谢詹姆斯。这确实是我让用户通过 fb 登录的方式,我认为你是对的,必须删除 fb 会话。我注意到一些网站向用户发送确认信息,并在通过 fb 注册后强制他重新登录,我猜目标是在没有 fb 的情况下创建一个全新的会话。但我没有尝试开始一个新会话,而是决定为 fb 用户和 myform 用户分别设置一个页面。这是一个小网站,大部分内容都是一样的,所以任何更改都可以从myform页面复制/粘贴到fb页面。

以上是关于无论用户是通过 facebook connect 还是我自己的表单登录,如何开始会话?的主要内容,如果未能解决你的问题,请参考以下文章

Facebook Connect:“<app> 发生错误,请稍后再试”

如何显示在我的 Facebook Connect 网站上注册的 Facebook 用户列表

如何通过 Facebook Connect 在 Facebook 墙上分享分数?

Phonegap Facebook Connect - 获取用户的生日和姓名

Facebook Connect - 同时使用 FBML 和 PHP 客户端

使用 PassportJS 和 Connect for NodeJS 来验证 Facebook 用户