Как начать сеанс, если пользователь вошел в систему через Facebook Connect или через мою форму?
Я предоставляю два варианта входа / регистрации: facebook connect и мою собственную форму входа / регистрации.
Я хочу перевести пользователей на ту же страницу после того, как они вошли в систему, используют ли они 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 для своих пользователей). Используя их информацию, я использую API Facebook, чтобы узнать, вошли они или нет. Если это не так, я генерирую URL логина. Как только они войдут в систему, $user
содержит их идентификатор пользователя в Facebook, который затем можно было бы запросить в моей собственной базе данных, чтобы выяснить, кто это на самом деле. Внутри оператора if, где $user
правда, я мог бы сделать вызов БД, который вытащил адрес электронной почты этих пользователей и назначил его своему собственному $_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, или просто переименуйте переменные сеанса.
(Я все еще новичок в API Facebook, поэтому я надеюсь, что это имеет смысл.)