Facebook PHP SDK – L'utente mostra ancora come connesso all'app Web anche se è stato disconnesso da Facebook

Sto lavorando a un sito Web per me stesso al fine di fornire il coaching a persone che sono interessate ad entrare a far parte di gruppi di fitness challenge. Per fare questo, ho deciso di usare Facebook come piattaforma per la corrispondenza di gruppo. Successivamente, ho iniziato a lavorare per integrare l'accesso a Facebook nel mio sito Web (www.fitnesschallenges.net) e sto mappando gli utenti di Facebook che si uniscono a un gruppo nel database del gruppo corrispondente all'interno del mio sito.

La piattaforma che sto usando per il mio sito è WordPress e ho dovuto essere un po 'creativo per far funzionare correttamente le funzionalità di login / logout come plugin WordPress (creando un passaggio tra gli script – fblogin.php e fblogout.php) . Finora, tutto sembra funzionare come dovrebbe con un'exception … quando un utente si disconnette da Facebook, il mio sito continua a mostrarli come registrati.

Ho fatto un numero di ricerche per questo particolare problema, di cui ci sono alcuni altri che hanno sperimentato lo stesso comportmento. Il risultato delle mie ricerche mi port a credere che abbia a che fare con sessioni e / o creare token di authentication, ma sono molto un programmatore alle prime armi e sto cercando qualche direzione su questo.

Grazie in anticipo.

userreg.php `

global $wpdb; // Remember to copy files from the SDK's src/ directory to a // directory in your application on the server, such as php-sdk/ require_once(plugin_dir_path( __FILE__ ) . "facebook-php-sdk/src/facebook.php"); $loginscript = plugins_url( 'fblogin.php', __FILE__ ); $logoutscript = plugins_url( 'fblogout.php', __FILE__ ); $challengeid = $atts['challengeid']; $config = arrays( 'appId' => '#################', 'secret' => '#################', 'allowSignedRequest' => false // optional but should be set to false for non-canvas apps ); $facebook = new Facebook($config); $user_id = $facebook->getUser(); if($user_id) { // We have a user ID, so probably a logged in user. // If not, we'll get an exception, which we handle below. try { $user_profile = $facebook->api('/me','GET'); function test_input($data) { $data = trim($data); $data = stripslashes($data); $data = htmlspecialchars($data); return $data; } $id = test_input($user_profile['id']); $name = test_input($user_profile['name']); $first_name = test_input($user_profile['first_name']); $last_name = test_input($user_profile['last_name']); $link = test_input($user_profile['link']); $username = test_input($user_profile['username']); $gender = test_input($user_profile['gender']); $email = test_input($user_profile['email']); $timezone = test_input($user_profile['timezone']); $locale = test_input($user_profile['locale']); $verified = test_input($user_profile['verified']); $table_name= $wpdb->prefix . "fcm_fbusercreds"; $currentmember_result = $wpdb->get_results( " SELECT * FROM $table_name WHERE id = $id " ); if(empty($currentmember_result)){ $wpdb->insert( $table_name, arrays( 'lastupdated' => current_time('mysql'), 'id' => $id, 'name' => $name, 'first_name' => $first_name, 'last_name' => $last_name, 'link' => $link, 'username' => $username, 'gender' => $gender, 'email' => $email, 'timezone' => $timezone, 'locale' => $locale, 'verified' => $verified, 'coach' => "0" ) ); } else { foreach ($currentmember_result as $result){ $wpdb->update( $table_name, arrays( 'lastupdated' => current_time('mysql'), 'name' => $name, 'first_name' => $first_name, 'last_name' => $last_name, 'link' => $link, 'username' => $username, 'gender' => $gender, 'email' => $email, 'timezone' => $timezone, 'locale' => $locale, 'verified' => $verified, 'coach' => "0" ), arrays( 'id' => $result->id ) ); } } return '<a href="' . $logoutscript . '?final=0&ls=' . $logoutscript . '&site=' . site_url() . '&pp=' . $_SERVER['REQUEST_URI'] . '"><img src="' . plugins_url( 'images/fb_logout.png' , __FILE__ ) . '" width="240" height="30" alt="" /></a>'; } catch(FacebookApiException $e) { // If the user is logged out, you can have a // user ID even though the access token is invalid. // In this case, we'll get an exception, so we'll // just ask the user to login again here. error_log($e->getType()); error_log($e->getMessage()); return '<a href="' . $loginscript . '?redirect=1&site=' . site_url() . '&pp=' . $_SERVER['REQUEST_URI'] . '&ls=' . $loginscript . '"><img src="' . plugins_url( 'images/fb_login.png' , __FILE__ ) . '" width="240" height="30" alt="" /></a>'; } } else { // No user, print a link for the user to login return '<a href="' . $loginscript . '?redirect=1&site=' . site_url() . '&pp=' . $_SERVER['REQUEST_URI'] . '&ls=' . $loginscript . '"><img src="' . plugins_url( 'images/fb_login.png' , __FILE__ ) . '" width="240" height="30" alt="" /></a>'; } } add_shortcode( 'fcmreg', 'fcm_fb' ); 

?> `

fblogin.php

`

 $config = arrays( 'appId' => '###################', 'secret' => '###################', 'allowSignedRequest' => false // optional but should be set to false for non-canvas apps ); $redirect = $_GET['redirect']; $site = $_GET['site']; $pagepath = $_GET['pp']; $ls = $_GET['ls']; if(isset($_GET['error'])){ header("Location: " . $site . $pagepath); exit; } $facebook = new Facebook($config); $user_id = $facebook->getUser(); // If redirect is one, then this is for regular user registration // if redirect is two, then this is for coach registration if($redirect == 1){ $params = arrays( 'scope' => 'email', 'redirect_uri' => $ls . '?redirect=' . $redirect . '&site=' . $site . '&pp=' . $pagepath . '&ls=' . $ls ); } elseif($redirect == 2) { $params = arrays( 'scope' => 'email, user_online_presence, create_event, manage_friendlists, publish_actions, manage_pages', 'redirect_uri' => $ls . '?redirect=' . $redirect . '&site=' . $site . '&pp=' . $pagepath . '&ls=' . $ls ); } $login_url = $facebook->getLoginUrl($params); if($user_id) { // We have a user ID, so probably a logged in user. // If not, we'll get an exception, which we handle below. try { header("Location: " . $site . $pagepath); } catch(FacebookApiException $e) { // If the user is logged out, you can have a // user ID even though the access token is invalid. // In this case, we'll get an exception, so we'll // just ask the user to login again here. header("Location: " . $login_url); error_log($e->getType()); error_log($e->getMessage()); } } else { // No user, print a link for the user to login header("Location: " . $login_url); } 

?> `

fblogout.php

`

 $config = arrays( 'appId' => '################', 'secret' => '################', 'allowSignedRequest' => false // optional but should be set to false for non-canvas apps ); $ls = $_GET['ls']; $site = $_GET['site']; $pagepath = $_GET['pp']; $final = $_GET['final']; $facebook = new Facebook($config); $params = arrays('next' => $ls . '?final=1&ls=' . $ls . '&site=' . $site . '&pp=' . $pagepath); $logoutUrl = $facebook->getLogoutUrl($params); if($final == 0){ header("Location: " . $logoutUrl); } if($final == 1){ $facebook -> destroySession(); header("Location: " . $site . $pagepath); } 

?> `

EDIT: un token di accesso lato server e lo stato di accesso effettivo di Facebook dell'utente sono indipendenti l'uno dall'altro. Dopo aver compreso meglio la tua domanda, quello che stai cercando di fare è vedere lo stato di accesso effettivo di Facebook di un utente. In realtà non stai riscontrando problemi nell'get i dati dell'utente dall'API. La soluzione migliore sarà utilizzare l'API Javascript di Facebook e la function FB.getLoginStatus: https://developers.facebook.com/docs/reference/javascript/FB.getLoginStatus/

Puoi inserirlo nel tuo file header.php di themes, o usare un filter di WordPress per inserirlo dopo il tag <body> apertura:

 <div id="fb-root"></div> <script> window.fbAsyncInit = function () { FB.init({ appId: 'YOUR_APP_ID', // App ID channelUrl: 'channel.html', // Channel File status: true, // check login status cookie: true, // enable cookies to allow the server to access the session xfbml: true // parse XFBML }); FB.getLoginStatus(function(response) { if (response.status === 'connected') { var uid = response.authResponse.userID; jQuery('#facebook_status').html('User is logged into Facebook and Fitnesschallenges.net app'); } else if (response.status === 'not_authorized') { jQuery('#facebook_status').html('User is logged into Facebook but not Fitnesschallenges.net app'); } else { jQuery('#facebook_status').html('User is not logged into Facebook'); } }); }; // Load the SDK Asynchronously (function (d) { var js, id = 'facebook-jssdk', ref = d.getElementsByTagName('script')[0]; if (d.getElementById(id)) { return; } js = d.createElement('script'); js.id = id; js.async = true; js.src = "//connect.facebook.net/en_US/all.js"; ref.parentNode.insertBefore(js, ref); }(document)); </script>d) { var js, id = 'facebook-jssdk', ref = d.getElementsByTagName('script')[0]; if (d.getElementById(id)) { return; } js = d.createElement('script'); js.id = id; js.async = true; js.src = "//connect.facebook.net/en_US/all.js"; ref.parentNode.insertBefore(js, ref); }(document)); </script> 

Quindi posiziona questo nella tua pagina da qualche parte per essere aggiornato con lo stato:

 <div id="facebook_status"></div>