无论用户是通过 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 - 获取用户的生日和姓名