Как начать сеанс, если пользователь вошел в систему через 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, поэтому я надеюсь, что это имеет смысл.)

Другие вопросы по тегам