Facebook Access Tokens - Serverseitige Authentifizierung

Hallo, ich versuche, die serverseitige Facebook-Authentifizierung zu verwenden, um das Zugriffstoken zu erhalten, aber ich erhalte weiterhin Fehler.

Ich benutze den Balg:

$app_id = "YOUR_APP_ID";
   $app_secret = "YOUR_APP_SECRET";
   $my_url = "YOUR_URL";

   session_start();
   $code = $_REQUEST["code"];

   if(empty($code)) {
     $_SESSION['state'] = md5(uniqid(rand(), TRUE)); //CSRF protection
     $dialog_url = "https://www.facebook.com/dialog/oauth?client_id=" 
       . $app_id . "&redirect_uri=" . urlencode($my_url) . "&state="
       . $_SESSION['state'];

     echo("<script> top.location.href='" . $dialog_url . "'</script>");
   }

   if($_REQUEST['state'] == $_SESSION['state']) {
     $token_url = "https://graph.facebook.com/oauth/access_token?"
       . "client_id=" . $app_id . "&redirect_uri=" . urlencode($my_url)
       . "&client_secret=" . $app_secret . "&code=" . $code;

     $response = file_get_contents($token_url);
     $params = null;
     parse_str($response, $params);

     $graph_url = "https://graph.facebook.com/me?access_token=" 
       . $params['access_token'];

     $user = json_decode(file_get_contents($graph_url));
     echo("Hello " . $user->name);
   }
   else {
     echo("The state does not match. You may be a victim of CSRF.");
   }

App ID und APP Secret wurden entfernt, machen Sie sich also keine Sorgen um diesen Teil. Ich erhalte eine Fehlermeldung zum Timeout von get_file_contents.

[function.file-get-contents]: Fehler beim Öffnen des Streams: Zeitüberschreitung der Verbindung

Gibt es eine andere oder bessere Möglichkeit, die Zugriffstoken zu erhalten?

Unten ist die Version, die ich ausprobiert habe, einschließlich der cURL-Idee:

function get_data_cURL($url)
{
  $ch = curl_init();
  $timeout = 5;
  curl_setopt($ch,CURLOPT_URL,$url);
  curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
  curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,$timeout);
  $data = curl_exec($ch);
  curl_close($ch);
  return $data;
}

function getAccessToken(){
    $app_id = FB_APP_ID;
    $app_secret = FB_SECRET_ID;
    $canvas_URL = FB_CANVAS_URL;

    session_start();
    $code = $_REQUEST["code"];

    if(empty($code)) {
      $_SESSION['state'] = md5(uniqid(rand(), TRUE)); //CSRF protection
      $dialog_url = "https://www.facebook.com/dialog/oauth?client_id=" 
        . $app_id . "&redirect_uri=" . urlencode($canvas_URL) . "&state="
        . $_SESSION['state'];

      echo("<script> top.location.href='" . $dialog_url . "'</script>");
    }

    if($_REQUEST['state'] == $_SESSION['state']) {
      $token_url = "https://graph.facebook.com/oauth/access_token?"
        . "client_id=" . $app_id . "&redirect_uri=" . urlencode($canvas_URL)
        . "&client_secret=" . $app_secret . "&code=" . $code;

     $returned_content = get_data_cURL($token_url);
    echo'Well Done! - '.$returned_content;

    }
    else {
      echo("The state does not match. You may be a victim of CSRF.");
    }
}

Einzelheiten:

App-Einstellungen - Canvas-URL:http://www.apps.elistone.co.uk/DrawMyFriend/

FB_APP_ID = The Facebook App ID
FB_SECRET_ID = The Facebook Secret ID
FB_CANVAS_URL = http://www.apps.elistone.co.uk/DrawMyFriend/

Selbst mit diesem Update erhalte ich immer noch diesen Fehler:

Alter FEHLER

Gut gemacht! - {"error": {"message": "Fehler beim Überprüfen des Bestätigungscodes.", "type": "OAuthException", "code": 100}}

Neuer Fehler

Dies scheint darauf zurückzuführen zu sein, dass die Umleitung den Statuscode entfernt.

Der Zustand stimmt nicht überein. Sie sind möglicherweise Opfer von CSRF. - 193c791ddd71c3fd84d411db5554c315 (Statuscode)

Ich habe auch versucht, den CSRF-Schutz zu umgehen, indem ich Folgendes geändert habe:

if($_REQUEST['state'] == $_SESSION['state'])

ZU:

 if(!empty($code))

Aber dies gibt immer noch das alte Fehlerproblem. Ich habe gehört, dass es durch etwas im Umleitungslink verursacht wird, aber ich bin nicht sicher, wie ich es beheben soll.

PROBLEM GELÖST

Nach einiger Zeit habe ich versucht, das PHP SDK zu verwenden.

$app_id = FB_APP_ID;
$app_secret = FB_SECRET_ID;
$canvas_URL = FB_PAGE_URL;
$code = $_REQUEST["code"];

if(empty($code)) {
  $_SESSION['state'] = md5(uniqid(rand(), TRUE)); //CSRF protection
  $dialog_url = "https://www.facebook.com/dialog/oauth?client_id=" 
    . $app_id . "&redirect_uri=" . $canvas_URL . "&state="
    . $_SESSION['state'];

  echo("<script> top.location.href='" . $dialog_url . "'</script>");
}
if($_REQUEST['state'] == $_SESSION['state']) {
$facebook->api('oauth/access_token', array(
    'client_id'     => FB_APP_ID,
    'client_secret' => FB_SECRET_ID,
    'type'          => 'client_cred',
    'code'          => $code,
));
$token = $facebook->getAccessToken();
echo$token;
}

Ich werde das jetzt in eine Art Funktion verwandeln. Vielen Dank für alle Zeit und Hilfe.

Hoffe, dies hilft Menschen in Not in der Zukunft (es sei denn, Facebook ändert alles plötzlich)

Antworten auf die Frage(2)

Ihre Antwort auf die Frage