it-swarm.com.de

Warum ist Facebook? PHP SDK getUser gibt immer 0 zurück?

Ich versuche, mit einer Website zu arbeiten, die einige Informationen von einem Facebook-Benutzer erfordert. Ich verwende PHP und JS-SDKs.

Ich habe eine Funktion in PHP:

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

Auf einer Klasse, die das Facebook-Objekt aus dem SDK in $this->_facebook enthält.

Dann auf einem Block mache ich das:

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

Und die FB JS-Umgebung ist richtig eingerichtet (denke ich), damit es funktioniert. Der Benutzer erhält das Popup und autorisiert die Site.

Das Problem ist auch, nachdem die App vom Benutzer autorisiert wurde. $ User ist immer 0, dh $facebook->getUser() gibt immer 0 zurück und listet dann die Gesichter der Benutzer auf, einschließlich des protokollierten Benutzers. Wenn ich jedoch $facebook->api('/me') oder was auch immer benutze, dann ist es der Fall Werde die ungültige Token-Ausnahme auslösen.

Ich habe dieses Problem gesehen, aber ich habe keine Lösung gesehen, ich habe keine Ahnung, wo das Problem liegt, und mir gehen die Ideen aus.

Auf der Facebook-Seite der Entwickler im Apps-Bereich gibt es eine Registerkarte für die Website, auf der Sie Ihre Site-URL und Ihre Site-Domäne einrichten können. Ich denke, dies ist die Ursache für mein Problem, aber ich weiß nicht genau, was diese sind Felder sollen enthalten.

39
fd8s0

Die Antwort auf mein spezielles Problem war, dass Inkompatibilitäten zwischen den Versionen des JS SDK und dem PHP SDK vorhanden waren, die ich gerade verwendete, und durch ein Upgrade wurde das Problem gelöst.

Das Symptom für dieses Problem ist ähnlich, wenn es auf eine Vielzahl verschiedener Ursachen zurückzuführen ist. Daher können Sie die verschiedenen Antworten auf dieser Seite sehr gut durchsuchen.

0
fd8s0

Ich hatte das gleiche Problem und fand es heraus, weil SDK die Variable $_REQUEST verwendet und in meiner Umgebung nicht wahr ist, dass es mit $_GET, $_POST und $_COOKIE Variablen zusammengeführt wird. 

Ich denke, es hängt von der PHP -Version ab und deshalb hat es jemand durch Aktivieren von Cookies zum Funktionieren gebracht.

Ich habe diesen Code in base_facebook.php gefunden:

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

Und ich habe es geändert, wie Sie unten sehen können, indem Sie die Variable $ server_info erstellen.

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

Ich bin auf ein ähnliches Problem gestoßen. $ facebook-> getUser () gab 0 zurück und gab manchmal eine gültige Benutzer-ID zurück, wenn der Benutzer nicht wirklich angemeldet war. Dies führte zu einem fatalen Oauth-Fehler, als ich versuchte, grafische API-Aufrufe durchzuführen. Ich habe dieses Problem endlich gelöst. Ich weiß nicht, ob es der richtige Weg ist, aber es funktioniert. Hier ist der 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

Sie müssen sicherstellen, dass Ihre App so eingestellt ist, dass sie den Codeparameter aus dem Abfrage-String und nicht aus dem uri_fragment abruft. Dies kann auf der Facebook-Apps-Seite apps>settings>permissions festgelegt werden.

Das tat es mir, indem ich $facebook->getLoginUrl() benutzte, um die Login-URL anzugeben.

3
Stephen Creasey

Stunden und Stunden den Bach runter. Keiner der Beiträge zu diesem Thema auf Stack Overflow oder anderen Websites bot die Lösung für mein Problem. Schließlich ging ich in den Bibliothekscode und erkannte genau, wo er starb.

Auf meinem Entwicklungscomputer, der XAMPP für Windows verwendet, erhielt ich immer die 0 für die Anmeldung, während mein Testserver ordnungsgemäß funktionierte. Nachdem mir klar wurde, dass eine Ausnahme ausgelöst, aber ausgeblendet wurde, habe ich in base_facebook.php ein $ e-> getMessage () eingefügt, in dem darauf hingewiesen wurde, dass ein SSL-Fehler aufgetreten ist. Der folgende Beitrag, HTTPS und SSL3_GET_SERVER_CERTIFICATE: Zertifikatprüfung fehlgeschlagen, CA ist in Ordnung , führte mich zu einer Lösung.

Die Lösung:

Fügen Sie in der base_facebook.php vor curl_exec ($ ch) Folgendes hinzu:

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

Sie sollten das oben genannte wahrscheinlich in die Flags einschließen, die Sie verwenden, um festzustellen, ob Sie sich im Entwicklungsmodus befinden, da Sie die oben genannte Zeile in einem Produktionssystem nicht möchten. Zum Beispiel:

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

Nach dem Debuggen über die base_facebook.php fand ich heraus, dass ich irgendwie meine .crt-Datei verloren hatte und das Zugriffstoken für immer ungültig ist. Stellen Sie sicher, dass Ihre fb_ca_chain_bundle.crt verfügbar ist: https://github.com/facebook/facebook-php-sdk/blob/master/src/fb_ca_chain_bundle.crt

2
Ian

Überprüfen Sie Ihr Konfigurationsarray. Stellen Sie sicher, dass Sie beim Festlegen der Werte die korrekten Anführungszeichen für String-Encaps verwenden.

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

Das funktioniert.

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

Dies ist ein direktes Kopieren/Einfügen von der Website http://developers.facebook.com/docs/reference/php/ und funktioniert aufgrund der komischen Anführungszeichen NICHT.

die lange Antwort ist, dass Ihr Hash für Ihre "Überprüfung" der App-Signatur nicht zu einer korrekten Überprüfung kommt, weil das App-Geheimnis keinen gültigen Wert zurückgibt (es gibt eigentlich nichts zurück) ... also die Funktion hash_hmac Rückgabe eines falschen Wertes, der nicht richtig übereinstimmt usw.

2
Jared Mark

$facebook->getUser() gibt 0 zurück, wenn der Benutzer die App nicht authentifiziert. 

verwenden Sie $facebook->getLoginUrl, um die URL zur Authentifizierung der App abzurufen.

1
Dino

Ich hatte genau das gleiche Problem in meiner Facebook-App und fand es schließlich nach 2 Tagen frustrierendem Haarzug heraus. Es stellte sich heraus, dass es Probleme mit dem Weiterleitungs-URI in der getLoginUrl() gab! Wenn es nicht der registrierten App-Domäne über Facebook entspricht, wird der Fehler zurückgegeben, und der Benutzer wird als 0 (Standardbenutzerwert) zurückgegeben.

1
Nick

Ich hatte dasselbe Problem mit getUser(), es gibt 0 in IE 8 zurück. Ich fand eine Lösung, nachdem ich etwas recherchiert hatte. Folgen Sie dem Link unten. Das hat wie ein Zauber funktioniert. 

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

1
Arun Karnati

Ich habe lange nachgeprüft und getestet, jetzt habe ich den Grund gefunden.

Bitte melden Sie sich an, Entwickler-Apps in Einstellungen -> Advance -> Migrationen -> Offline-Zugriff aufheben -> deaktiviert .

Sie finden $ facebook-> getUser () funktionieren.

etwas anderes. hatte besser Domäne hinzuzufügen, wenn die Facebook-Klasse neu ist;

$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

Probieren Sie dies in Ihrem Code aus: Wenn die Bedingung wahr ist, werden Sie zu Facebook weitergeleitet. Melden Sie sich dann selbst an und ich hoffe, dass Sie bis dahin gut dastehen, aber denken Sie daran, neue Bibliotheken von PHP SDK zu verwenden

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

Nach einigen verzweifelten Stunden führte dies zu demselben Problem auf meinem Server: Wenn Sie SSL verwenden, stellen Sie sicher, dass Port 443 nicht blockiert ist! Ich habe den Hafen im letzten Jahr geöffnet, aber es stellte sich heraus, dass mein Webhoster in letzter Zeit irgendwie zurückgesetzt wurde.

1
Ingo

ich löste dieses Problem, da ich vor dem gleichen Problem stand .. Gehen Sie einfach zu Developers.facebook.com/apps und navigieren Sie dann zu Ihrer App. __

WENN Sie "App auf Facebook" aktiviert haben und eine Canvas-URL eingegeben haben Die App wird außerhalb des Facebook nicht funktionieren Funktioniert unter apps.facebook.com/

einfach diesen Check entfernen, es hat bei mir funktioniert

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

Dies sind gute Vorschläge, aber das, was für mich funktioniert hat, ist auf Facebook selbst. Nachdem ich den Code viele Male überarbeitet hatte, wurde mir klar, dass es ein Problem mit den Konfigurationen auf Facebook ist.
Die folgenden Schritte haben mein Problem behoben.

1.) Unter Basic> App auf Facebook ... habe ich die Auswahl aufgehoben, obwohl Sie es verlassen können, wenn Sie möchten 

2.) Klicken Sie unter Berechtigungen> Datenschutz auf Öffentlich

Berechtigungen> Auth Token -> auf Abfragezeichenfolge setzen

3.) Unter Erweitert -> Authentifizierung> App-Typ -> Web

Der dritte Schritt ist der, der wirklich alles repariert hat, nicht ganz sicher, warum, aber ich hoffe, das hilft

0
isaacewing

Stellen Sie sicher, dass Sie diese Facebook-API-Funktion getUser before any aufrufen, da sie Session-Variablen und Cookies verwendet. Header können nicht korrekt gesendet/gelesen werden.

0
Markus Zeller

Ein facebook-> getUser () gibt 0 zurück, wenn kein Benutzer angemeldet ist. (https://developers.facebook.com/docs/reference/php/facebook-getUser/)

Um dies zu beheben, stellt das Facebook JS SDK ein Zugriffstoken bei einem erfolgreichen Login bereit, das Sie mit dem SDK von Facebook PHP verwenden können. 

Das folgende Javascript überprüft, ob bereits ein Facebook-Login vorhanden ist und ob Ihre Facebook-App autorisiert ist:

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

Die Funktion _accessServer öffnet eine weitere Anforderung an Ihren Server und sendet das Zugriffstoken. 

Die Funktion _loginPopup sollte das Facebook-Login-Popup-Fenster öffnen und die entsprechenden Berechtigungen für den Benutzer anfordern, um den Zugriff auf Ihre Anwendung zuzulassen. 

Die Anwendung PHP sollte dann das Zugriffstoken an die Facebook-API zurückgeben:

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

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

Hoffentlich hilft das. 

0
Henry Tseng

Ich habe auch viele Stunden damit verbracht, mir das anzuschauen und fand auch eine Lösung. Vielleicht nicht für Sie, aber es scheint ein Problem mit $ _SERVER ['QUERY_STRING'] zu geben, so dass Sie es in das $ _REQUEST-Array setzen müssen.

Ich verwendete Codeigniter und stellte fest, dass der folgende Code oberhalb der Bibliothekslast funktionierte.

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

Dieses Problem ist wirklich komisch. Ich habe entdeckt, dass das Problem das statische $ CURL_OPTS-Array in der base_facebook.php war.

Versuchen Sie es von hier aus zu bearbeiten:

  /**
   * 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',
  );

zu

  /**
   * 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

Wenn diese Frage für die Menschen immer noch relevant ist, möchte ich meine 2 Cent einbringen, da ich einige Zeit gekämpft habe, um die Dinge zum Laufen zu bringen.

Probieren Sie zunächst das für Sie geeignete SDK aus, sei es PHP oder JS. Im Wesentlichen machen beide dasselbe, es ist nur so, dass JS etwas eleganter damit umgeht (mit dem Popup-Dialog und was nicht). Es gibt eine Menge verschiedener Tutorials, Handbücher und Beispiele! Es dauerte ungefähr eine Woche, bis ich eine gefunden hatte, die zu mir passte und die ich tatsächlich verwenden konnte. Wenn Sie den Code gefunden haben, der mit dem SDK funktioniert, das Sie verwenden möchten, müssen Sie den Code an Ihre speziellen Anforderungen anpassen.

Nachdem ich meinen Code fertiggestellt hatte, fing ich an, ihn zu testen. Ich bemerkte, dass ich meinen Code auf localhost ausführte und auch von meinen Arrays keine Ergebnisse erhielt. m Ihre Frage zu beantworten: Laden Sie Ihren Code in eine (Sub-) Domain hoch und versuchen Sie es erneut. Mein Code hat die ganze Zeit funktioniert, aber da ich ihn nicht online hatte, hat er nicht funktioniert. Wenn Sie es bereits online haben, ist meine Antwort für Sie nicht von Nutzen.

Es tut mir leid, wenn diese Art von kleiner Geschichte nicht wirklich für SO gedacht ist, aber es könnte den Leuten helfen.

Viel Glück!

0
Edwin Lambregts

Wenn Sie das neue SDK 3.1.1 und JS verwenden, müssen Sie der aufgerufenen Routine FB.init eine neue Variable hinzufügen 

oauth : truezum Verwenden des neuen OATH 2.0-Protokolls! Aktualisieren Sie dann Ihre Anmeldeschaltfläche, wenn keine Perms zulässig sind

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

so wie ich mein Problem behoben habe, gibt es jetzt die Details des Benutzerprofils zur weiteren Verarbeitung zurück. (Es war so ein Kopfschmerz)

0
R T

Das Hinzufügen dieser Zeile löste dieses Problem für mich in 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() und PHP-SDK schlagen unbemerkt fehl, wenn _REQUEST globale Variablen enthält, die durch falsche Konfiguration vom HTTP-Server gelöscht werden. Ich verwendete falsch konfiguriertes nginx und löste dieses Problem nach ca. 3 Stunden über vhost-Konfigurationsänderung.

Ich habe hier einen Kommentar zur Lösung geschrieben: https://github.com/facebook/php-sdk/issues/418#issuecomment-2193699

Ich hoffe es hilft.

0
edigu