2012-04-02 9 views
1

Ich habe das gleiche Problem wie viele andere, dass die Methode getUser() in der PHP-SDK geben immer Null zurück. Ich finde heraus, dass der Grund dafür eine Bedingung in der Methode parseSignedRequest() ist.facebook-> getUser() gebe immer 0 zurück

if ($sig !== $expected_sig) { 
    self::errorLog('Bad Signed JSON signature!'); 
    return NULL; 
} 

Der Zustand ist immer wahr. Wenn ich diese Bedingung auschecke, funktioniert es gut. Ich bekomme den richtigen Benutzer und ich kann auch ein Token mit allen Berechtigungen holen, wo ich danach frage.

Aber ich fühlte mich unwohl mit dieser schmutzigen Lösung. Warum kann es sein? Gibt es vielleicht eine Fehlkonfiguration auf dem Server?

Mit freundlichen Grüßen

Antwort

0

ich genau das gleiche Problem habe .. hat mich 4 Tage gedauert es aufzuspüren ...

Hier ist das Ergebnis meiner Debug-Echo des bedingten, wo Sie $ haben sig wird mit $ expected_sig verglichen.

sig: [ꢖbuf^4 ֣ GP

erwartet sig: {.nwW: rB ForC8 $ % F

Aus irgendeinem Grund stimmt die gesendete Signatur NICHT mit einer der erwarteten codierten Signaturen überein.

Also habe ich mich gefragt ... was könnte hier falsch sein?

Könnte es sein, dass ich nicht das richtige "Secret" passiere, obwohl ich es gerade in meiner Konfiguration aufstelle?

require_once("facebook.php"); 

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

$facebook = new Facebook($config); 

Wie sich herausstellt, wenn ich

$facebook->getAppID(); 

oder

$facebook->getAppSecret(); 

wird nichts zurück verwenden!

Aus diesem Grund meine getSignedRequestCookieName() Funktion nur "fbsr_"

Aus diesem Grund

$expected_sig = hash_hmac('sha256', $payload, 
          $facebook->getAppSecret(), $raw = true); 

kehrt die falsche Hash zurück!

ABER WARUM?

Einfache Antwort: ein schlecht gebildet Config Array ...

Mit "$ config [‚appId‘] = $ APP_ID;" ... die Zitate bemerken um "appId". Dies war ein direktes Kopieren/Einfügen aus den Dokumenten/Beispielen in den Entwicklerdokumenten von Facebook.

Ersetzen Sie diese Zitate mit Standard doppelte Anführungszeichen

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

...hier ist das Ergebnis:

sig: r0g% W (B^Ddv

erwartet sig: r0g% W (B^Ddv

Sie passen jetzt ...

Lange Rede kurzer Sinn ... tun, um eine phpinfo(), um sicherzustellen, dass Sie ein signed_request Token sind immer .. Wenn Sie sicher sind, dass Sie das bekommen (oder die "$ REQUEST [fbsr #######]" var) ... wenn Sie sicher sind, erhalten Sie eine verschlüsselte signierte Anfrage ... die Der einzige Grund, warum Ihr Hash nicht übereinstimmt, ist, wenn Sie nichts bekommen das richtige Geheimnis drin.

Verwandte Themen