API Facebook: вход с использованием JavaScript SDK, затем проверка состояния входа с помощью PHP

Я использую JavaScript SDK Facebook, чтобы вызвать всплывающее окно входа, когда пользователь нажимает кнопку входа.

Код, как Facebook предоставляет в документации:

$(".loginButton").click(function(){
 FB.login(function(response) {
    FB.api('/me', function(response) {
       console.log(response.id);
       //User ID shows up so I can see that the user has accepted the app.
     });
 });

Я также могу использовать FB.getLoginStatus(), чтобы убедиться, что пользователь действительно вошел в систему и принял приложение.

Однако теперь я хотел бы выполнить функцию с PHP. Насколько я понимаю, PHP имеет $user, которому присваивается UserID после успешного входа в систему.

Проблема в том, что после входа в JS $user все еще 0. Я застрял и не могу понять, почему он не назначает правильный идентификатор пользователя для $user

Вот мой JS:

    <script type="text/javascript">  

        window.fbAsyncInit = function() {
            FB.init({
                appId  : '<?php echo $AppId; ?>',
                status : true, // check login status
                cookie : true, // enable cookies to allow the server to access the session
                xfbml  : true,
                channelUrl  : '<?php echo $ServerPath; ?>channel.php' // custom channel
            });

    }; 


    //Get Login Status
    function amILoggedIn(){
        var toreturn = "";
        FB.getLoginStatus(function(response) {
            if (response.status === 'connected') {
                window.userId =  response.authResponse.userID;
            toreturn = "GetLoginStatus: logged in" + " " + "<?php echo $user; ?>";
            } else {
            toreturn = "GetLoginStatus: Logged Out";
            }
            console.log(toreturn);
        }); 


    };


    // Load the SDK asynchronously
    (function(d, s, id){
         var js, fjs = d.getElementsByTagName(s)[0];
         if (d.getElementById(id)) {return;}
         js = d.createElement(s); js.id = id;
         js.src = "//connect.facebook.net/en_US/all.js";
         fjs.parentNode.insertBefore(js, fjs);
       }(document, 'script', 'facebook-jssdk'));

            var obj = {
                    method: 'feed',
                    link: 'http://www.google.com'
                };


    $(".loginPopupButton").click(function(){
         FB.login(function(response) {
            FB.api('/me', function(response) { //user-specific stuff
               console.log(response.id);
             });
         });

    });

    </script>

И вот PHP:

    <?php
    include_once('fbapi/facebook.php');
    include_once('fbapi/Authenticated_User.php');
    include_once('config.php');


    // Create our Application instance.
    $facebook = new Facebook(array(
                    'appId'  => $AppId,
                    'secret' => $AppSecret
                ));
    //Facebook Authentication part
    $user = $facebook->getUser();


    $perms = "manage_pages";
    if(isset($_GET['backlink']))
        $redirectUrl   = urldecode($_GET['backlink']);
    else
        $redirectUrl   = $fullserverpath;

    $cancelUrl   = $ServerPath."index.php?page=loginWFb";

    //AA - where to go to get FB popup.    
    $loginUrl = $facebook->getLoginUrl(
            array(
                'scope' => $perms,
                'redirect_uri' => $redirectUrl,
                'cancel_uri' => $cancelUrl
            )
    );



    //AA- Defining that a powerUSER is someone who's logged in
    if(isset($user)){
        $_SESSION['loggedIn'] = $user;

    }

    ?>

person user1386254    schedule 14.07.2013    source источник
comment
Вам нужно передать токен доступа из JS в PHP (и использовать его в библиотеке PHP).   -  person Seth Battin    schedule 08.10.2013


Ответы (3)


Вход с помощью JS SDK сохраняет данные для входа в файлы cookie Facebook, а вход с помощью PHP SDK сохраняет данные в сеансе PHP. Поэтому, если вы войдете в систему с помощью JS SDK, PHP SDK не узнает об этом.

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

FB.getLoginStatus(function(response) {
    if (response.status === 'connected') {
        // Full redirect or ajax request according to your needs
        window.location.href = 'login.php?signed_request='+response.authResponse.signedRequest;
    }
});

Затем $facebook->getUser() даст вам идентификатор пользователя в вашем PHP-коде.

person Ale    schedule 08.10.2013
comment
«Поэтому, если вы войдете в систему с помощью JS SDK, PHP SDK не узнает об этом». — официальная документация прошу не согласиться - person CBroe; 08.10.2013
comment
Вы правы, я этого не знал. Тогда я предложу более простой ответ. - person Ale; 08.10.2013

При инициализации объекта Facebook в PHP попробуйте установить для параметра sharedSession значение true:

$facebook = new Facebook(array(
    'appId'         => $AppId,
    'secret'        => $AppSecret,
    'sharedSession' => true
));
person Ale    schedule 08.10.2013

вы можете найти рабочий пример отсюда

http://liferaypower.blogspot.com/2013/10/index.html

Образец кода

FB.init({
    appId: '490986011016528', // App ID

    channelUrl: 'http://localhost:8000/', // Channel File

    status: true, // check login status

    cookie: true, // enable cookies to allow the server to access session

    xfbml: true  // parse XFBML

});

FB.Event.subscribe('auth.authResponseChange', function(response) 
{

    if (response.status === 'connected') 
    {

       document.getElementById("message").innerHTML +=  "ConnectedtoFacebook";
 }  
 else if (response.status === 'not_authorized') 
 {

document.getElementById("message").innerHTML +=  "<br>Failed to Connect";
   //FAILED

 }

else 
  {

    document.getElementById("message").innerHTML +=  "<br>Logged Out";
      //UNKNOWN ERROR

   }
});
person jakhaniya jayesh    schedule 05.03.2015