39 votes

Pourquoi Facebook PHP SDK getUser renvoie-t-il toujours 0?

Je suis en train de travailler avec un site web qui nécessite certaines informations à partir d'un Facebook de l'utilisateur, j'utilise PHP et JS Kits de développement logiciel.

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 est maintenant le facebook de l'objet à partir du SDK en $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 le FB JS environnement est correctement mis en place (je pense) de sorte qu'il fonctionne. Ainsi, l'utilisateur obtient le pop up et autorise le site.

Le problème est que même après que l'app a été autorisée par l'utilisateur $user est toujours 0, ce qui signifie $facebook->getUser() retourne toujours 0, et énumère ensuite les visages des utilisateurs, y compris la session de l'utilisateur, mais si je fais appel $facebook->api('/me') ou que ce soit, alors il va jeter l'invalide jeton d'exception.

J'ai vu ce problème, mais je n'ai pas vu une solution, je n'en ai aucune idée où est le problème et je n'ai plus d'idées.

Il y a un onglet du Site web des développeurs Facebook page dans la section "applications", où vous pouvez définir l'URL de votre Site et le Domaine de votre Site, et je pense que c'est à cause de mon problème, mais je ne sais pas exactement ce que ces champs sont censés contenir.

23voto

Norberto Yoan Points 191

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

Je pense que cela dépend de la version de PHP et c'est pourquoi quelqu'un l'a fait fonctionner par l'activation des 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 par la création de $server_info variable.

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;
}

5voto

anujkk Points 395

J'ai rencontré un problème similaire. $ facebook-> getUser () retournait 0 et parfois, il retournait 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 graphes à l'API. J'ai finalement résolu ce problème. Je ne sais pas si c'est la bonne façon mais ça marche. 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'))}");
}

?>
 

4voto

Syed I.R Points 2585

3voto

Stephen Creasey Points 59

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. Vous pouvez le définir sur la page des applications facebook apps>settings>permissions .

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

2voto

Jared Mark Points 116

Vérifiez votre tableau de config. S'assurer que vous êtes en utilisant une chaîne de encaps les guillemets lors de la définition des valeurs.

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

Les travaux de cette.

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

C'est un copier/coller direct à partir du site web http://developers.facebook.com/docs/reference/php/ et ne fonctionne PAS à cause de l'étrange ondulés et des citations.

la réponse longue est que votre hash pour votre "vérification" de l'application de la signature n'est pas de sortir à un chèque correct, parce que le secret de l'app ne retourne pas une valeur valide (elle retourne rien, en fait)... donc le hash_hmac fonction renvoie une valeur incorrecte qui ne correspondent pas correctement, etc...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X