17.122014

Facebooks Deauthorize Callback URL testen

Jeder Softwareentwickler der schon mal Apps für Facebook programmiert hat oder einen Facebook Login bei einer bestehenden Webseite integriert hat, ist bestimmt auch über den Deauthorize Callback gestolpert. User haben nämlich jederzeit die Möglichkeit einer App die gegebenen Rechte wieder zu entziehen ("deauthorize"). Dies kommt einer Deinstallation der Anwendung gleich. Da dieser Vorgang auf Facebook passiert, gibt es die Deauthorize Callback URL die von Facebook aufgerufen wird um die App zu informieren.

Um diesen Vorgang auch lokal auf der Entwicklungsumgebung testen zu können muss man den Aufruf simulieren. Wie das geht, habe ich mal in diesem Blogpost zusammengefasst.

Facebook ruft die URL auf und übergibt den Parameter signed_request. Dieser Parameter enthält verschlüsselt die Informationen über den User, der die App deauthorized hat. Um genau das zu simulieren könnt ihr das folgende Script nehmen. Ihr müsst nur die drei Variablen in der Configuration anpassen, das Script dann mit einem Browser aufrufen und auf den Button klicken.

<?php
  /*
   * Configurations
   * Set app secret, deauthorize url and user_id (and additional data you want to pass to your script) here
   */
  $app_secret = "YOUR_APP_SECRET_HERE";
  $deauthorize_url = "YOUR_DEAUTHORIZE_SCRIPT_HERE";
  $data = array(
    'algorithm' => 'HMAC-SHA256',
    'issued_at' => 1332153487,
    'user' => array(
      'country' => 'de',
      'locale' => 'de_DE'
    ),
    'user_id' => '10000123456789'
  );

  /**
   * Generates the signed request parameter
   *
   * @param mixed $data
   * @param string $secret
   */
  function generateSignedRequest($data, $secret) {
    $payload = base64UrlEncode(json_encode($data));
    $signature = base64UrlEncode(hash_hmac('sha256', $payload, $secret, $raw = true));
    return "$signature.$payload";
  }

  /**
   * Helper function for encoding
   *
   * @param string $input
   */
  function base64UrlEncode($input) {
    $input = rtrim(base64_encode($input), '=');
    return strtr($input, '+/', '-_');
  }
?>
<!DOCTYPE unspecified PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
  <head></head>
  <body>
    <form action="<?php echo $deauthorize_url; ?>" method="post">
      <input type="hidden" name="signed_request" value="<?php echo generateSignedRequest($data, $app_secret);?>">
      <input type="submit" value="Deauthorize Callback URL">
    </form>
  </body>
</html>

Das Script beginnt mit der Konfiguration. Anschließend folgen zwei Funktionen die den verschlüsselten Request String generieren. Ganz unten ist der HTML Code zum Anzeigen des Buttons.