Интеграция с Facebook на PHP-сайте

#authentication #login #oauth #facebook #legacy

#аутентификация #oauth #Facebook #наследие

Вопрос:

Я пытаюсь интегрировать свой существующий php-сайт с функциями входа в Facebook. В настоящее время у меня есть простое имя пользователя, пароль и адрес электронной почты для активации, и их данные хранятся в базе данных MYSQL. Я хочу добавить дополнительный доступ для входа в систему для пользователей Facebook. Я беспокоюсь о том, как я смогу интегрировать свой текущий доступ для входа в систему с новым доступом к facebook. Я считаю, что все мои страницы требуют, чтобы пользователи входили в систему, и я использую файлы cookie для хранения переменных сеанса, таких как nickname, которые я использую для создания контента на своих страницах.

Меня смущают многие подходы, которые я исследовал в Интернете, некоторые из них, к сожалению, устарели, а другие кажутся половинчатыми решениями. Эти три продолжают повторяться.

А) Login.php , Register.php и fbReg.php В login.php и register.php появляется при входе в систему с помощью fb login/register для создания сеанса и прохождения аутентификации в fbReg.php но это просто останавливается на пустом экране после перенаправления страницы.

(фрагмент из Register.php )

 <script type="text/javascript">
FB.init({appId: '<?php echo $fb_app_id; ?>', status: true,
    cookie: true, xfbml: true});

<?php
    if ($errors == 0) {
    ?>
    $('#form_hidden').hide();
<?php } else { ?>
    checkInput('username');
    checkInput('email');
    checkInput('lastname');
    checkInput('firstname');
    checkInput('password');
    checkInput('password2');
<?php } ?>
</script>
  

Б) Устаревшая аутентификация подключения
http://developers.facebook.com/docs/authentication/connect_auth/
Используя приведенную выше ссылку, я создал несколько тестовых сценариев, просто чтобы посмотреть, будет ли работать аутентификация. К счастью, на моем сайте у меня есть сторонние объявления или веб-фреймы, но я следовал инструкциям к письму, создавая interstititial_page и перенаправляя страницу с моей главной страницы входа. Однако я продолжаю получать нулевой сеанс.

(фрагмент страницы входа в php)

 $api_key = "YOUR_API_KEY";
$interstitial_page = "YOUR_SECURE_URL"; //URL with no 3rd party apps

$url='http://www.facebook.com/login.php?api_key=' . $api_key  
. 'amp;session_version=3amp;next=' . urlencode($interstitial_page)
. 'amp;v=1.0amp;return_session=1amp;fbconnect=1'
. 'amp;cancel_url=' . urlencode($interstitial_page);

echo "Welcome to the Old Auth flow";
echo "<p>";

echo("<a href='" . $url . "'>"
. "<img src='http://static.ak.facebook.com/images/"
. "devsite/facebook_login.gif'></a>");
  

C) Протокол OAuth 2.0
http://developers.facebook.com/docs/authentication/
когда я использую это снова, используя следующий скрипт:

  https://www.facebook.com/dialog/oauth?
 client_id=YOUR_APP_IDamp;redirect_uri=YOUR_URL
  

Я пытался и не смог использовать это для сбора информации о пользователях для моих новых пользователей сайта Facebook и сохранения ее в базе данных MySQL, а затем интегрировать этот аутентифицированный доступ к Facebook с «обычным» сеансом пользователя веб-доступа, поскольку это связано с переменными сеанса, которые используются в пользовательском интерфейсе.

Любая помощь будет оценена, я сейчас борюсь.

Спасибо, Майкл

я получаю пустой экран на fbReg.php

Ответ №1:

Я только что сделал это для своего сайта на прошлой неделе, поэтому я знаю, как сложно перебирать все многочисленные методы, многие из которых устарели. Это был мой подход:

  1. Я разместил на своем сайте ссылку «Войти в систему с помощью Facebook», которая перенаправляет на мою обычную страницу регистрации.

     <a href="http://www.facebook.com/dialog/oauth?client_id=<? echo $FACEBOOK_APP_ID ?>amp;redirect_uri=http://www.yoursite.com/register.phpamp;scope=email">Log in with Facebook</a>
      
  2. Мой сценарий регистрации выглядит следующим образом:

     <html xmlns="http://www.w3.org/1999/xhtml" xmlns:fb="http://www.facebook.com/2008/fbml">
    <head></head>
    <body>
    <div id="fb-root"></div>
    <script src="http://connect.facebook.net/en_US/all.js"></script>
    <script>
    FB.init({appId: '<? echo $FACEBOOK_APP_ID ?>', status: true, cookie: true, xfbml: true});
    FB.Event.subscribe('auth.login', function(response) { window.location.reload(); });
    </script>
    
    function get_facebook_cookie($app_id, $app_secret) 
    {
        $args = array();
        parse_str(trim($_COOKIE['fbs_' . $app_id], '\"'), $args);
    
        ksort($args);
        $payload = '';
        foreach ($args as $key => $value) {
        if ($key != 'sig') {
        $payload .= $key . '=' . $value;
        }
        }
        if (md5($payload . $app_secret) != $args['sig']) {
        return null;
        }
        return $args;
    }
    
    $cookie = get_facebook_cookie($FACEBOOK_APP_ID, $FACEBOOK_SECRET);
    if($cookie)
    { 
        $access_token = $cookie['access_token'];
    
    }
    $url = 'https://graph.facebook.com/me?access_token='.$access_token;
    $graph = file_get_contents($url);
    if($graph) 
    {
    
        $fbuser = json_decode($graph);
        $userid = $fbuser->id;
        $email = mysql_real_escape_string($fbuser->email);
    
        /********************** 
        I placed code here to check if the  email already exists in my database, which means they are already a member. 
        In that case, I retrieve their username and password from the database and automatically log them 
        in by rerouting them to my login script with their crenditials sent as well.
        ***********************/
    
        /********************** 
        If the email is not already in my database, then I know it's a new user and so I prompt them to make a username here. 
        ***********************/
    }
    //The user either opted to log in using my traditional non-Facebook method, or something went wrong with the FB authentication
    else 
    {
    
        /********************** 
        Show my normal registration form that prompts for username, email, etc 
        ***********************/
    }
      
  3. В моем сценарии входа в систему я устанавливаю имя пользователя и т. Д. Файлы cookie Как обычно.

Надеюсь, это поможет!

Комментарии:

1. Это очень помогает. У вас действительно хорошее решение, у меня просто есть несколько вопросов. 1) когда у вас есть новый пользователь fb, который выбирает маршрут Facebook, после того, как вы предоставили им регистрацию на Facebook, и они прошли проверку подлинности, как вам подключить их к действительному сеансу? Это путем перенаправления их на предварительно заполненный сценарий входа с учетными данными? 2) Вы json_decode, чтобы получить $ userid и $email. Используете ли вы их для вставки в свою базу данных? Я хочу использовать имя, фамилию и имя пользователя fb в своем веб-приложении.

2. 1. Да, когда у меня появляется новый пользователь FB, после того, как он выбирает имя пользователя, мой код в основном входит в систему для них (по сути, устанавливает сеансовые файлы cookie), как если бы они сами нажали традиционную кнопку входа. Итак, в вашем сценарии регистрации, после того, как у вас будет вся необходимая информация для вашего нового пользователя FB, просто перенаправьте свой сценарий входа, передав его учетные данные. Я делаю это, используя скрытую форму, которую мой скрипт отправляет самостоятельно. 2. Да, как только у меня есть идентификатор пользователя и адрес электронной почты, а затем я прошу их выбрать имя пользователя, я вставляю их в свою базу данных как нового пользователя.

3. Не могли бы вы поделиться своими полными сценариями — регистрация и измененная страница входа. (очевидно, десенсибилизированный). Мой адрес электронной почты michael.mkpadi@michuksltd.com . Я очень благодарен. Спасибо

4. Я получаю эту ошибку, используя сценарий регистрации, подобный тому, который вы указали выше. Предупреждение: file_get_contents( graph.facebook.com/me?access_token = ) [function.file-get-contents]: не удалось открыть поток: отказано в подключении

5. ОБНОВЛЕНИЕ: я заменил file_get_contents на curl. Обработка ошибок лучше. Но когда я нажимаю на ссылку «Войти с помощью Facebook» на моем основном сайте на моем регистрационном php, скрипт FB.init, похоже, не работает, поскольку я не могу получить проверку авторизации при входе в систему, и условное перенаправление перенаправляет меня на мой логин, не связанный с facebook, даже когда у меня теперь есть активныйсеанс fb. Любая помощь будет оценена.

Ответ №2:

Я не могу сказать, говорите ли вы о социальных плагинах, но если да, то эти плагины Facebook имеют встроенные в страницы генераторы, которые будут генерировать нужный вам код.

Если вы ищете не плагины, а информацию для пользователей, я все же рекомендую вам запустить генераторы, чтобы получить код и посмотреть, как Facebook получает информацию для пользователей.

Следуя пути простых скриптов, вы попадете туда, где вам нужно быть.

Комментарии:

1. Спасибо за ваш ответ. Мне нужны социальные плагины с расширениями. Простая кнопка входа, регистрация и аутентификация. Мой сайт уже делает это, но я хочу добавить в Facebook новую регистрацию пользователя и обычный доступ пользователя через аутентификацию Facebook. Ничто из того, что я видел на сайте разработчиков facebook или в более широком Интернете, похоже, не дает мне четкого представления о том, что мне нужно, чтобы начать создавать в Facebook доступ к моим существующим файлам php.

2. developers.facebook.com/docs/reference/plugins/login Логин есть, и аутентификация будет автоматически использоваться этим плагином. Вы могли бы использовать i-фрейм для регистрации, поскольку нет API для регистрации нового пользователя. Этот iframe может перейти на домашнюю страницу, где находится регистрация

3. Спасибо за предложение, но я не думаю, что вы полностью понимаете мои требования. Позвольте мне объяснить. Я хочу, чтобы пользователи Facebook, которые никогда раньше не использовали мое веб-приложение, могли зарегистрироваться в моей базе данных MYSQL и получить все атрибуты «обычных» пользователей, включая сеанс «веб-сайт», а не сеанс facebook. Все новые плагины OAuth 2.0 login / register / authentication действительно просты в настройке, но их сложно интегрировать в мой существующий веб-сайт, поскольку я хочу получить информацию о пользователе и сохранить ее в своей базе данных пользователей MYSQL и создать переменные cookie сеанса для пользователя с указанной информацией о пользователе. устаревшие вещи сейчас не работают.