web-dev-qa-db-fra.com

Pourquoi Facebook PHP SDK getUser renvoyant toujours 0?

J'essaie de travailler avec un site Web nécessitant des informations d'un utilisateur de Facebook, j'utilise PHP et les kits de développement logiciel (SDK) JS.

J'ai une fonction en PHP:

public function isLoggedOnFacebook() {
    $user = $this->_facebook->getUser();
    if ($user) {
        return $this->_facebook->api("/$user");
    }
    return false;
}

Sur une classe qui contient l'objet facebook du SDK dans $this->_facebook.

Puis sur un bloc je fais ceci:

<?php if (!$this->isLoggedOnFacebook()): ?>
<div>
   <fb:login-button show-faces="true" perms="email" width="500" />
</div>
<?php endif ?>

Et l’environnement FB JS est correctement configuré (je pense) pour que cela fonctionne. Donc, l'utilisateur obtient le pop-up et autorise le site.

Le problème persiste même après que l'application a été autorisée par l'utilisateur. $ User vaut toujours 0, ce qui signifie que $facebook->getUser() renvoie toujours 0, puis répertorie les visages des utilisateurs, y compris l'utilisateur connecté, mais si je le fais appeler, appelez $facebook->api('/me') Je vais lancer l'exception de jeton invalide.

J'ai vu ce problème, mais je n'ai pas vu de solution, je ne sais pas du problème et je suis à court d'idées.

Il y a un onglet Site Web sur la page Facebook des développeurs dans la section des applications, où vous pouvez configurer l'URL de votre site et votre domaine de site. Je pense que cela est la cause de mon problème, mais je ne sais pas exactement ce que cela les champs sont supposés contenir.

39
fd8s0

La réponse à mon problème spécifique était qu’il existait des incompatibilités entre les versions du SDK JS et du SDK PHP que j’utilisais et que leur mise à niveau résolvait le problème.

Le symptôme de ce problème est similaire lorsqu'il est provoqué par une variété de facteurs différents. Vous pouvez donc très bien analyser les différentes réponses disponibles sur cette page.

0
fd8s0

J'ai eu le même problème et j'ai compris que c'est parce que le SDK utilise la variable $_REQUEST et que dans mon environnement n'est pas vrai, il est fusionné avec les variables $_GET, $_POST et $_COOKIE

Je pense que cela dépend de la version PHP et c'est pourquoi quelqu'un l'a fait fonctionner en activant les cookies.

J'ai trouvé ce code dans base_facebook.php:

protected function getCode() {
    if (isset($_REQUEST['code'])) {
        if ($this->state !== null &&
                isset($_REQUEST['state']) &&
                $this->state === $_REQUEST['state']) {

            // CSRF state has done its job, so clear it
            $this->state = null;
            $this->clearPersistentData('state');
            return $_REQUEST['code'];
        } else {
            self::errorLog('CSRF state token does not match one provided.');
            return false;
        }
    }

    return false;
}

Et je l'ai modifié comme vous pouvez le voir ci-dessous en créant la variable $ server_info.

protected function getCode() {
    $server_info = array_merge($_GET, $_POST, $_COOKIE);

    if (isset($server_info['code'])) {
        if ($this->state !== null &&
                isset($server_info['state']) &&
                $this->state === $server_info['state']) {

            // CSRF state has done its job, so clear it
            $this->state = null;
            $this->clearPersistentData('state');
            return $server_info['code'];
        } else {
            self::errorLog('CSRF state token does not match one provided.');
            return false;
        }
    }

    return false;
}
23
Norberto Yoan

J'ai rencontré un problème similaire. $ facebook-> getUser () renvoyait 0 et renvoyait parfois un identifiant d'utilisateur valide alors que l'utilisateur n'était pas connecté, ce qui entraînait une erreur Fatal Oauth lorsque j'essayais de faire des appels graphiques à l'API. J'ai finalement résolu ce problème. Je ne sais pas si c'est la bonne façon mais cela fonctionne. Voici le code:

<?php
include 'includes/php/facebook.php';
$app_id = "APP_ID";
$app_secret = "SECRET_KEY";
$facebook = new Facebook(array(
    'appId' => $app_id,
    'secret' => $app_secret,
    'cookie' => true
));

$user = $facebook->getUser();

if ($user <> '0' && $user <> '') { /*if valid user id i.e. neither 0 nor blank nor null*/
try {
// Proceed knowing you have a logged in user who's authenticated.
$user_profile = $facebook->api('/me');
} catch (FacebookApiException $e) { /*sometimes it shows user id even if user in not logged in and it results in Oauth exception. In this case we will set it back to 0.*/
error_log($e);
$user = '0';
}
}
if ($user <> '0' && $user <> '') { /*So now we will have a valid user id with a valid oauth access token and so the code will work fine.*/
echo "UserId : " . $user;

$params = array( 'next' => 'http://www.anujkumar.com' );
echo "<p><a href='". $facebook->getLogoutUrl($params) . "'>Logout</a>";

$user_profile = $facebook->api('/me');
echo "<p>Name : " . $user_profile['name'];
echo "<p>";
print_r($user_profile);

} else {/*If user id isn't present just redirect it to login url*/
header("Location:{$facebook->getLoginUrl(array('req_perms' => 'email,offline_access'))}");
}

?>
5
anujkk
4
Syed I.R

Vous devez vous assurer que votre application est configurée pour extraire le paramètre de code de la chaîne de requête plutôt que du fragment uri_fragment. Cette option peut être définie sur la page apps>settings>permissions des applications facebook.

Cela s’est fait pour moi en utilisant $facebook->getLoginUrl() pour fournir l’URL de connexion.

3
Stephen Creasey

Des heures et des heures à l'égout. Aucun des messages à ce sujet sur Stack Overflow ou d'autres sites n'a fourni la solution à mon problème. Je suis finalement entré dans le code de la bibliothèque et j'ai compris exactement où elle se mourait.

Sur ma machine de développement, qui utilise XAMPP pour Windows, je continuais à obtenir le 0 pour me connecter, alors que mon serveur de test fonctionnait correctement. Après avoir réalisé qu'une exception était levée mais cachée, j'ai mis un $ e-> getMessage () dans base_facebook.php, qui indiquait que j'avais une erreur SSL. Le message suivant, HTTPS et SSL3_GET_SERVER_CERTIFICATE: échec de la vérification du certificat, CA est OK , m'a amené à une solution.

La solution:

Dans base_facebook.php, ajoutez les éléments suivants avant curl_exec ($ ch):

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

Vous devriez probablement envelopper les éléments ci-dessus dans tous les indicateurs que vous utilisez pour déterminer si vous êtes en mode développement, car vous ne souhaitez pas utiliser la ligne ci-dessus dans un système de production. Par exemple:

if ( getenv( 'environment' ) === 'development' ) {
    curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, false );
}
2
levans

Après le débogage par le biais du fichier base_facebook.php, j’ai constaté que, parce que j’avais perdu mon fichier .crt, le jeton d’accès est définitivement invalide. Vérifiez que votre fichier fb_ca_chain_bundle.crt est disponible à l’adresse: https://github.com/facebook/facebook-php-sdk/blob/master/src/fb_ca_chain_bundle.crt

2
Ian

Vérifiez votre tableau de configuration . Assurez-vous que vous utilisez des guillemets d'encapsulation de chaîne appropriés lors de la définition des valeurs.

$config = array();
$config["appId"] = $APP_ID;
$config["secret"] = $APP_SECRET;
$config["fileUpload"] = false; // optional

Cela marche.

$config = array();
$config[‘appId’] = 'YOUR_APP_ID';
$config[‘secret’] = 'YOUR_APP_SECRET';
$config[‘fileUpload’] = false; // optional

Ceci est un copier/coller direct à partir du site Web http://developers.facebook.com/docs/reference/php/ et ne fonctionne PAS à cause des guillemets irréguliers.

la réponse longue est que votre hachage pour votre "vérification" de la signature de l'application ne donne pas une vérification correcte, car le secret de l'application ne renvoie pas de valeur valide (il ne renvoie rien, en fait) ... renvoyer une valeur incorrecte qui ne correspond pas correctement, etc ...

2
Jared Mark

$facebook->getUser() retournera 0 si l'utilisateur n'authentifie pas l'application. 

utilisez $facebook->getLoginUrl pour obtenir l'URL permettant d'authentifier l'application.

1
Dino

J'avais exactement le même problème sur mon application Facebook et je l'ai finalement compris après 2 jours de frustration. Cela s'est avéré être un problème avec le redirect-uri dans la getLoginUrl()! si cela ne correspond pas au domaine d'application enregistré via Facebook, ils renvoient l'erreur et l'utilisateur est renvoyé à 0 (valeur d'utilisateur par défaut).

1
Nick

J'ai eu le même problème avec getUser(), il renvoie 0 dans IE 8. J'ai trouvé une solution après des recherches. Suivez le lien ci-dessous. Cela a fonctionné comme un charme. 

http://www.andugo.com/facebook-php-sdk-getuser-return-0-value-on-ie/

1
Arun Karnati

J'ai vérifié et testé longtemps, maintenant j'ai trouvé la raison.

Veuillez vous connecter aux applications de développeur, dans paramètres -> Avancé -> Migrations -> Déconseillez l'accès hors ligne - -> désactivé .

Vous trouverez que $ facebook-> getUser () fonctionnera.

autre chose. Il vaut mieux ajouter un domaine lors de la création de la classe facebook;

$facebook = new Facebook(array(
'appId' => APP_ID,//$app_id,
'secret' => APP_SECRET,//$app_secret,
'cookie' => true,
'domain'=>'xxxdomain.com',
));
$session = $facebook->getUser();    
1
Bob Jeey

Essayez ceci dans votre morceau de code:

if(($facebook->getUser())==0)
{
 header("Location:{$facebook->getLoginUrl(array('scope' => 'photo_upload,user_status,publish_stream,user_photos,manage_pages'))}");
 exit;
}
else {
$accounts_list = $facebook->api('/me/accounts');
echo "i am connected";
}
1
Faizan Qadri

Après quelques heures désespérées, voici ce qui a causé le même problème sur mon serveur: Si vous utilisez SSL, assurez-vous que le port 443 n'est pas bloqué ! J'ai ouvert le port l'année dernière, mais il est apparu que mon hébergeur Web avait récemment effectué une réinitialisation.

1
Ingo

j'ai résolu le problème alors que je rencontrais le même problème .. Il suffit d'aller dans développeurs.facebook.com/apps, puis accédez à votre application appuyez sur le bouton MODIFIER APP

SI vous avez coché "App sur facebook" et que vous avez entré une URL de toile à ce sujet L'application ne fonctionnera pas côté facebook Fonctionnera sous apps.facebook.com/

il suffit de retirer ce chèque cela a fonctionné pour moi

1
Hemen Ashodia
<?php

require 'facebook.php';

// Create our application instance
// (replace this with your appId and secret).
$facebook = new Facebook(array(
  'appId'  => 'YOUR_APP_ID',
  'secret' => 'YOUR_APP_SECRET',
));

// Get User ID
$user = $facebook->getUser();

// We may or may not have this data based 
// on whether the user is logged in.
// If we have a $user id here, it means we know 
// the user is logged into
// Facebook, but we don’t know if the access token is valid. An access
// token is invalid if the user logged out of Facebook.

if ($user) {
  try {
    // Proceed knowing you have a logged in user who's authenticated.
    $user_profile = $facebook->api('/me');
  } catch (FacebookApiException $e) {
    error_log($e);
    $user = null;
  }
}

// Login or logout url will be needed depending on current user state.
if ($user) {
  $logoutUrl = $facebook->getLogoutUrl();
} else {
  $loginUrl = $facebook->getLoginUrl();
}

// This call will always work since we are fetching public data.
$naitik = $facebook->api('/naitik');

?>
<!doctype html>
<html xmlns:fb="http://www.facebook.com/2008/fbml">
  <head>
    <title>php-sdk</title>
    <style>
      body {
        font-family: 'Lucida Grande', Verdana, Arial, sans-serif;
      }
      h1 a {
        text-decoration: none;
        color: #3b5998;
      }
      h1 a:hover {
        text-decoration: underline;
      }
    </style>
  </head>
  <body>
    <h1>php-sdk</h1>

    <?php if ($user): ?>
      <a href="<?php echo $logoutUrl; ?>">Logout</a>
    <?php else: ?>
      <div>
        Login using OAuth 2.0 handled by the PHP SDK:
        <a href="<?php echo $loginUrl; ?>">Login with Facebook</a>
      </div>
    <?php endif ?>

    <h3>PHP Session</h3>
    <pre><?php print_r($_SESSION); ?></pre>

    <?php if ($user): ?>
      <h3>You</h3>
      <img src="https://graph.facebook.com/<?php echo $user; ?>/picture">

      <h3>Your User Object (/me)</h3>
      <pre><?php print_r($user_profile); ?></pre>
    <?php else: ?>
      <strong><em>You are not Connected.</em></strong>
    <?php endif ?>

    <h3>Public profile of Naitik</h3>
    <img src="https://graph.facebook.com/naitik/picture">
    <?php echo $naitik['name']; ?>
  </body>
</html>
1
R' Zone

Ce sont de bonnes suggestions, mais ce qui a fonctionné pour moi, c'est sur Facebook lui-même. Après avoir refacturé le code plusieurs fois, j'ai réalisé que c'était un problème avec les configurations sur Facebook.
Les étapes suivantes ont résolu mon problème.

1.) Sous Basic> App sur Facebook ... J'ai désélectionné le choix, mais vous pouvez le laisser si vous le souhaitez. 

2.) Sous Autorisations> Confidentialité -> définissez sur Public

Autorisations> Jeton d'authentification -> défini sur Chaîne de requête

3.) Sous Avancé -> Authentification> Type d'application -> Web

La troisième étape est celle qui a vraiment résolu le problème, pas tout à fait sûr de savoir pourquoi, espérons que cela aide

0
isaacewing

Assurez-vous d'appeler cette fonction API Facebook getUser avant toute sortie, car elle utilise des variables de session et des cookies. Les en-têtes ne peuvent pas être envoyés/lus correctement si vous l’avez fait.

0
Markus Zeller

Un facebook-> getUser () retournera 0 s'il n'y a pas d'utilisateur connecté. (https://developers.facebook.com/docs/reference/php/facebook-getUser/)

Pour résoudre ce problème, le SDK Facebook JS fournit un jeton d'accès à partir d'une connexion réussie que vous pouvez utiliser avec le SDK PHP de Facebook. 

Le javascript ci-dessous permettra de vérifier si une connexion Facebook existe déjà et si votre application Facebook est autorisée:

FB.getLoginStatus(function($response) {
    if ($response.status === 'connected') {
        var uid = $response.authResponse.userID;
        var accessToken = $response.authResponse.accessToken;
        _accessServer(uid, accessToken);

    } else if ($response.status === 'not_authorized') {
        _loginPopup();

    } else {
        _loginPopup();
    }
});

La fonction _accessServer ouvre une autre requête à votre serveur, en envoyant le jeton d'accès. 

La fonction _loginPopup devrait ouvrir la fenêtre contextuelle de connexion à Facebook demandant les autorisations appropriées pour permettre à l'utilisateur d'autoriser l'accès à votre application. 

L’application PHP doit ensuite renvoyer le jeton d’accès à l’API de Facebook:

$facebook->setAccessToken($new_access_token);
$uid = $facebook->getUser();

https://developers.facebook.com/docs/reference/php/facebook-setAccessToken/

J'espère que cela pourra aider. 

0
Henry Tseng

J'ai également passé de nombreuses heures à regarder cela et à trouver une solution. Peut-être pas pour vous, mais il semble y avoir un problème avec $ _SERVER ['QUERY_STRING'], vous devez donc le définir dans le tableau $ _REQUEST.

J'utilisais codeigniter et j'ai constaté que le code suivant au-dessus du chargement de la bibliothèque fonctionnait.

parse_str ($ _ SERVER ['QUERY_STRING'], $ _ REQUEST);

    parse_str($_SERVER['QUERY_STRING'],$_REQUEST);
    $config = array(); 
    $config["appId"] = "63xxxxx39";
    $config["secret"] = "dexxxx3bf";
    $this->load->library('facebook',$config);

    $this->user = $user = $this->facebook->getUser();
    if ($user) {

        try {
                // Proceed knowing you have a logged in user who's authenticated.
                $user_profile = $this->facebook->api('/me');
                //print_r($user_profile);exit;
        } catch (FacebookApiException $e) {
                echo '<pre>'.htmlspecialchars(print_r($e, true)).'</pre>';
                $user = null;
        }
        $logout = $this->facebook->getLogoutUrl();
        $this->fb_logout = $logout;
        $this->fb_user = $user_profile;

    } else {
        $login = $this->facebook->getLoginUrl(array("scope"=>"email","redirect_uri"=>"http://domain/login/login_fbmember/"));
        $this->fb_login = $login;
    }

}
0
karmafunk

Ce problème est vraiment étrange. J'ai découvert que le problème venait du tableau statique $ CURL_OPTS du fichier base_facebook.php.

Essayez de le modifier à partir de ceci:

  /**
   * Default options for curl.
   *
   * @var array
   */
  public static $CURL_OPTS = array(
    CURLOPT_CONNECTTIMEOUT => 10,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT        => 60,
    CURLOPT_USERAGENT      => 'facebook-php-3.2',
  );

à

  /**
   * Default options for curl.
   *
   * @var array
   */
  public static $CURL_OPTS = array(
    CURLOPT_CONNECTTIMEOUT => 10,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT        => 60,
    CURLOPT_USERAGENT      => 'facebook-php-3.2',
    CURLOPT_IPRESOLVE => CURL_IPRESOLVE_V4 
  );
0
Michelangelo

Si cette question est toujours d'actualité, j'aimerais apporter mes 2 centimes car j'ai du mal à trouver le temps de faire fonctionner les choses.

Tout d’abord, essayez le SDK qui vous conviendrait, que ce soit PHP ou JS. Essentiellement, ils font tous les mêmes choses, mais JS pourrait les traiter un peu plus élégants (avec la boîte de dialogue contextuelle ou non). Il y a beaucoup de différents tutoriels, manuels et exemples! Il m'a fallu une semaine pour en trouver un qui me convienne et que je puisse utiliser. Une fois que vous avez trouvé le code compatible avec le SDK que vous envisagez d’utiliser, il est temps de le modifier en fonction de vos besoins spécifiques.

Une fois mon code terminé, j'ai commencé à le tester. J'ai remarqué que je courais mon code sur localhost, et moi aussi je n'obtenais aucun résultat de mes tableaux. Pour répondre à votre question: téléchargez votre code dans un (sous) domaine et réessayez. Mon code a fonctionné tout le temps, mais parce que je ne l'avais pas en ligne, cela n'a pas fonctionné. Si vous l'avez déjà en ligne, ma réponse ne vous sera pas utile.

Je suis désolé si ce genre de petite histoire n'est pas vraiment destiné à SO, mais cela pourrait aider les gens.

Bonne chance!

0
Edwin Lambregts

Si vous utilisez le nouveau SDK 3.1.1 et JS, vous devez ajouter une nouvelle variable à la routine FB.init appelée 

oauth : truepour utiliser le nouveau protocole OATH 2.0! Mettez à jour votre bouton de connexion alors que les permanentes ne sont pas autorisées, veuillez utiliser scope au lieu de perms

0
Sascha Heim
    if ($facebook->getUser()) {
       $userProfile = $facebook->api('/me');
       // do logic
    } else {
       $loginUrl = $facebook->getLoginUrl($params = array('scope' => SCOPE));
       header('Location:' . $loginUrl);
    }

que comment j'ai résolu mon problème, maintenant il me renvoie le détail du profil de l'utilisateur pour un traitement ultérieur (c'était un tel mal de tête)

0
R T

L'ajout de cette ligne a résolu ce problème pour moi dans IE9:

header('P3P:CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT"'); // This is the main cause to use on IE.
0
psycho brm

getUser() et PHP-SDK échouent en silence si _REQUEST, comme les globales abandonnées par un serveur http suite à une mauvaise configuration. J'utilisais nginx mal configuré et après environ 3 heures de suivi du code, ce problème a été résolu via un changement de configuration vhost.

J'ai écrit un commentaire sur la solution ici: https://github.com/facebook/php-sdk/issues/418#issuecomment-2193699

J'espère que ça aide.

0
edigu