Получить основную информацию о пользователе с помощью плагина кнопки входа в Facebook?

Здесь я использую плагин кнопки входа в Facebook и javascript sdk.

Я могу успешно войти в систему и выйти из нее, используя вышеуказанное.

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

Пожалуйста, предложите, как я могу это сделать.

<p><fb:login-button autologoutlink="true"></fb:login-button></p>


    <div id="fb-root"></div>
    <script>
        window.fbAsyncInit = function () {
            FB.init({ appId: '123456', status: true, cookie: true,
                xfbml: true
            });
        };


        (function () {
            var e = document.createElement('script');
            e.type = 'text/javascript';
            e.src = document.location.protocol +
          '//connect.facebook.net/en_US/all.js';
            e.async = true;
            document.getElementById('fb-root').appendChild(e);
        } ());
    </script>

person Yashwant Kumar Sahu    schedule 20.08.2011    source источник


Ответы (4)


Подпишитесь на мероприятие auth.login. Если вы сделаете это, Facebook вызовет ваш обработчик после входа в систему, как это произошло.

В этом обработчике используйте FB.api для вызова Graph API для получения любого информацию, которую вы желаете. Например, вызов /me, как показано во втором примере, даст вам основную информацию о вошедшем в систему пользователе.

Теперь у вас есть все данные в JavaScript. Чтобы отправить это на ваш сервер, выполните простой старый запрос XMLHttpRequest/AJAX. Ваша библиотека JavaScript, вероятно, упрощает эту задачу — в jQuery это jQuery.ajax() — но в худшем случае вы можете использовать XHR напрямую.

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

person Wayne Kao    schedule 20.08.2011
comment
Согласно ответу @Jon Watte, имейте в виду, что информации о пользователе, отправленной через AJAX, нельзя доверять. Лучше отправлять на сервер только идентификатор пользователя Facebook и токен доступа и искать информацию о пользователе в вызове API на стороне сервера. - person grossvogel; 14.12.2011
comment
Нет ли более элегантного способа непосредственно с Facebook? Это решение очень небезопасно - person basZero; 28.02.2012

Также можно использовать комбинацию PHP SDK и JS SDK, причем последний выполняет вход в систему, а первый сохраняет данные на сервере. Что-то типа:

<?php
require_once 'config.php';
require_once 'lib/facebook.php';

$facebook = new Facebook(array(
    'appId' => FB_APP_ID,
    'secret' => FB_APP_SECRET,
));


?>
<!DOCTYPE html>
<html xmlns:fb="http://www.facebook.com/2008/fbml">
<body>

<div id="fb-root"></div>
<script>
    window.fbAsyncInit = function () {
        FB.init({
            appId:'<?php echo $facebook->getAppID() ?>',
            cookie:true,
            xfbml:true,
            oauth:true
        });
        FB.Event.subscribe('auth.login', function (response) {
            window.location = "showUser.php"; //redirect to showUser.php on Login
        });
        FB.Event.subscribe('auth.logout', function (response) {
            window.location.reload();
        });
    };
    (function () {
        var e = document.createElement('script');
        e.async = true;
        e.src = document.location.protocol +
            '//connect.facebook.net/en_US/all.js';
        document.getElementById('fb-root').appendChild(e);
    }());
</script>
<div class="fb-login-button" data-show-faces="true" data-width="200"
     data-max-rows="1"></div>
</body>
</html>

А в showUser.php у вас есть что-то вроде:

<?php
#showUser.php
require_once 'config.php';
require_once 'lib/facebook.php';

$facebook = new Facebook(array(
    'appId' => FB_APP_ID,
    'secret' => FB_APP_SECRET,
));

$user = $facebook->getUser();

if($user)
{
    if ($user) {
        try {
            // Proceed knowing you have a logged in user who's authenticated.
            $user_profile = $facebook->api('/me');
            var_dump($user_profile); //You can now save this data
        } catch (FacebookApiException $e) {
            echo '<pre>'.htmlspecialchars(print_r($e, true)).'</pre>';
            $user = null;
        }
    }
}

?>
person Jubstuff    schedule 16.03.2012
comment
Что такое файл config.php, на который вы здесь ссылались? Идентификатор приложения и секретный ключ уже включены. прямо под включает. - person pg.; 17.04.2013
comment
Нет, под включением я передаю идентификатор приложения и секретный ключ конструктору Facebook. Они определены в config.php - person Jubstuff; 18.04.2013

В этом решении есть дыра — это означает, что пользователь может составить любую информацию, которую он хочет, и отправить XHR обратно на мой сервер. Серверу нужно будет напрямую связаться с Facebook.

person Jon Watte    schedule 28.09.2011
comment
Это должен был быть комментарий, поэтому я добавил его к ответу выше. - person grossvogel; 14.12.2011
comment
Большинство сайтов используют вход через FB или ручную форму входа. Нет смысла делать вход в FB таким безопасным, если все, что они хотят сделать, это придумать что-то, они могут просто использовать ручную форму входа. Нет смысла ставить дополнительную защиту на один, а не на другой. Имейте в виду, что вы никогда не будете в большей безопасности, чем ваше самое слабое звено. - person Jonathan Tonge; 10.06.2012

 //very simple just change this line
fb:login-button autologoutlink="true"

//with this one

fb: кнопка входа в систему autologoutlink="true" onlogin='your_ajax_fun_that_store_in_db()'

function your_ajax_fun_that_store_in_db(){
  FB.api('/me', function(response) {
     $.post( "ajax/store_user_info.php",response, function( data ) {
     //write you js code here !
     //you can use the (response) from facebook directly in your store_user_info.php as it will be sent in POST array
     });
 });
}
//last thing when you face such a problem the first thing to do is to go back to facebook reference of fun.
person ashraf mohammed    schedule 06.02.2014