4 Stimmen

Facebook-App: OAuthException: Es muss ein aktives Zugriffs-Token verwendet werden

Ich habe das nächste Problem bei der Umstellung meiner alten Facebook-App auf Oauth 2.0:

Wenn ich versuche, das Benutzerprofil zu lesen (im php-Code), erhalte ich den Fehler: " OAuthException: Ein aktives Zugriffstoken muss verwendet werden, um Informationen über den aktuellen Benutzer abzufragen. "

Die Anwendung macht die Login-Operation über Javascript und dann leitet es zu einer Seite, wo von php bekomme ich das Benutzerprofil.

Der Javascript-Code:

<script type="text/javascript">
window.fbAsyncInit = function() {   
    FB.init({
        appId   : '<?php echo $facebook->getAppId() ?>',
        cookie  : true, // enable cookies to allow the server to access the session
        xfbml   : true, // parse XFBML
        oauth : true    // enable oauth
    });

    // whenever the user logs in, we refresh the page
    FB.Event.subscribe('auth.login', function(response) {
        window.location="index.php";
    });

};

(function() {
    var e = document.createElement('script');
    e.src = document.location.protocol + '//connect.facebook.net/en_US/all.js';
    e.async = true;
    document.getElementById('fb-root').appendChild(e);
}());

function login () {
 FB.login(function(response) {
   if (response.authResponse) {
     //console.log('Welcome!  Fetching your information.... ');
     FB.api('/me', function(response) {
       //alert('Good to see you, ' + response.name + '.');
       var url="./code.php";
       window.location=url;
     });
   } else {
     alert("Debes de identificarte y aceptar las condiciones para obtener el descuento");
   }
 }, {scope: 'email'});

};

</script>

Der php-Teil (in code.php):

require 'facebook-php-sdk/src/facebook.php';

// Create our Application instance (replace this with your appId and secret).
$facebook = new Facebook(array(
  'appId'  => 'xxxxxxxxxxxxxxxxx',
  'secret' => 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
));
$user = $facebook->getUser();   
if ($user) {
    try {
        // Proceed knowing you have a logged in user who's authenticated.
        $me = $facebook->api('/me');
.....

Ich habe verschiedene Beiträge gelesen und versucht, Dinge wie immer die access_token aus der Javascript-Login-Antwort oder aus dem Cookie und machen dann den Aufruf api('me/?access_token=...), aber es hat nicht funktioniert.

Edit: Vielen Dank an alle, es funktioniert jetzt!!!

Danke

1voto

Mehul Hingu Punkte 1230

@moguzalp @brandwaffle @yauros,To get signed_request on non canvas app. i used the follwing code and it works for me. Wenn Sie Oauth 2.0 verwenden, erhalten Sie ein Cookie namens fbsr_app_id. Dieses Cookie ist nichts anderes als eine signierte Anfrage.

Sie können dieses Cookie abrufen und die signierte Anfrage wie folgt parsen, um die Benutzerkennung und den Zugriffstoken zu erhalten:

$cookieName = 'fbsr_' . $app_id;

function parse_signed_request($signed_request, $secret) {
  list($encoded_sig, $payload) = explode('.', $signed_request, 2); 

  // decode the data
  $sig = base64_url_decode($encoded_sig);
  $data = json_decode(base64_url_decode($payload), true);

  if (strtoupper($data['algorithm']) !== 'HMAC-SHA256') {
    error_log('Unknown algorithm. Expected HMAC-SHA256');
    return null;
  }

  // check sig
  $expected_sig = hash_hmac('sha256', $payload, $secret, $raw = true);
  if ($sig !== $expected_sig) {
    error_log('Bad Signed JSON signature!');
    return null;
  }

  return $data;
}
function base64_url_decode($input) {
  return base64_decode(strtr($input, '-_', '+/'));
}
$fbsr=parse_signed_request($_COOKIE[$cookieName],$application_secret);

$user_id=$fbsr['user_id'];

0voto

asdf_enel_hak Punkte 7238

@MehulHingu vorgeschlagene Lösung passt zu Ihrem Fall

Sie können jedoch besser mit: in Ihrem PHP-Code, get&parse signed_request und Auszug access_token (wenn der Benutzer bereits Ihre App authentifiziert und die entsprechende Berechtigung erteilt hat) mit Ihrer Facebook php api

Sie erhalten signed_request wenn Ihre Leinwand aufgerufen wird: https://app.faceobook.com/yourapp

Andernfalls können Sie sich mit dem Javascript-Login problemlos registrieren und um Erlaubnis bitten.

Wenn Ihr registrierter Benutzer kommt, wäre diese Methode effizienter.

Hinweis: Wie brandwaffle schon sagte, gilt dieser Vorschlag, wenn Ihre App eine Canvas-App ist.

0voto

Mehul Hingu Punkte 1230

Wenn Sie die Java-Script-Funktion FB.Login verwenden, erhalten Sie ein Zugriffstoken und eine Benutzerkennung als Antwort

var uid = response.authResponse.userID;
var accessToken = response.authResponse.accessToken;

Sie können accessToken und die Benutzerkennung über Ajax an Ihren PHP-Code übergeben und in Api-Aufrufen in PHP verwenden.

Und denken Sie daran, wenn Sie sich mit dem Java-Skript FB.login anmelden, dann

$user = $facebook->getUser();

wird in php nicht funktionieren.

Um zu prüfen, ob der Benutzer angemeldet und autorisiert ist, verwenden Sie folgenden Code

    try {
    $me_arr = array(
    'access_token'=>$access_token ,    
    );
        $user_profile = $fb->api('/me',$me_arr);
        if($user_profile){
    // user is authanticated

                        }
    else
    {
    // not 

    }

      } catch (FacebookApiException $e) {

        error_log($e);

}

0voto

brandwaffle Punkte 1242

UPDATE: Ihr JS-Code meldet Sie ab, kurz bevor die Seite neu geladen wird. Das bringt die PHP-Seite gehörig durcheinander! :)

Solange der Benutzer angemeldet ist und Ihre Anwendung über das JavaScript-SDK genehmigt hat, sollten Sie nur das Zugriffstoken auf der PHP-Seite abrufen müssen, damit alles funktioniert. Ich habe Ihr Beispiel wie folgt geändert:

require 'facebook-php-sdk/src/facebook.php';

// Create our Application instance (replace this with your appId and secret).
$facebook = new Facebook(array(
  'appId'  => 'xxxxxxxxxxxxxxxxx',
  'secret' => 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
));
$user = $facebook->getUser();   
$token = $facebook->getAccessToken();
if ($user) {
  try {
    // Proceed knowing you have a logged in user who's authenticated.
    $me = $facebook->api('/me' . $token);

Ich weiß, dass du dieses Beispiel schon einmal ausprobiert hast. Es ist also wichtig zu wissen, dass dein Zugangs-Token ungültig sein kann, während du noch bei Facebook angemeldet bist. Dies würde dazu führen, dass die if($user)-Prüfung bestanden wird, aber der API-Aufruf mit einem ungültigen access_token versucht wird. Um sicherzustellen, dass dies nicht passiert, var_dump aus dem $token-Wert - wenn es Ihre app_id und Geheimnis durch ein "|" getrennt ist, dann haben Sie keinen gültigen Zugriffstoken.

Ich konnte mich auf der JS-Seite in einer Testanwendung anmelden, dann den Code auf der PHP-Seite laden und meinen Benutzernamen anzeigen lassen. Sie können es hier in Aktion sehen: http://brandwaffle.info/facebook/

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X