Facebook API: OAuth Access Token generieren

Sa, 21.07.2012 - 12:29 -- admin

Für mein kleines Experiment einer Facebook App:Facebook client for Enigma2 / Dreambox brauchte ich die OAuth User Access Tokens, um Zugriff auf den Open Graph von Facebook zukommen. Dazu muss man bei Facebook eine App erstellen. Die Generierung der Tokens erfolgt dann über die üblichen Facebook "Anwendung Installations-Anfragen" innerhalb des Browser. Da man unter Enigma2 allerdings keinen echten Browser hat, musste ich etwas Basteln.

Access Token

Ohne einen Access Token kann man die Facebook API nicht ansprechen. Dieser Token muss für jeden Benutzer generiert werden und ist quasi der Benutzer und Kennwort zur Authentifizierung. Um an diese Tokens zu kommen ist zwingend eine Facebook App nötig, die man sich über einen Developer Account bei Facebook erstellen kann. Den Request muss man dann über https an senden.

Erstellung der Facebook Anwendung

Über die Facebook Developer Page erstellt man eine normale Anwendung, die die nötigen Keys für seine App Requests bereitstellt. Hat man alles konfiguriert kann man die URL unten mit Inhalt befüllen. Der Anwender erhält hierbei den Standard Facebook Dialog zur Installation der Anwendung inklusive einer Anfrage welche Berechtigung man dieser Anwendung erteilt.

https://www.facebook.com/dialog/oauth?client_id=<client_id>&scope=<scope>&response_type=token&redirect_uri=<redirect_uri>

Parameter Beschreibung
client_id oder auch App ID genannt, gibt es direkt in Facebook auf der Hauptseite der Anwendung
scope kommaseparierte Liste von Berechtigung, die vom User freigeben werden sollen. Hier mal ein paar Beispiel um Zugriff auf die Freunde, Timeline sowie Posten von Inhalten zu erhalten: read_stream,read_friendlists,publish_stream
redirect_uri Nachdem der Facebook User die Anfragen bestätigt hat wird er an diese Url weitergeleitet, der Access Token wird an die Url per "Anker Hash" übergeben. Zugriff ist somit nur Clientseitig möglich!

Authentifizierung durchführen

Zur Authentifizierung der Anwendung reicht es nun einfach den Link im Browser aufzurufen. Hat der Anwender die Anfrage bestätigt wird er an die redirect_uri, mit dem Access Token als Anker Hash im Schlepptau weitergeleitet. An den Access Token kommt nun nur per Javascript. Die gelesenen Werte (access_token) lassen sich dann entweder mit einem weiteren Redirect oder durch einen Ajax-Aufruf weiterverarbeiten.

http://donmain.de/file.php#access_token=AAAGQn8xxxx&expires_in=4375

Access Token als Javascript Objekt

Einfaches Beispiel um den Access Token über den Hash-Anker in ein Javascript Key-Value Objekt zu übergeben.

function getParameters() {
  var searchString = window.location.hash.substring(1)
  var params = searchString.split("&")
  var hash = {}
 
  for (var i = 0; i < params.length; i++) {
    var val = params[i].split("=");
    hash[unescape(val[0])] = unescape(val[1]);
  }
  return hash;
}

Access Token verlängern

Die generierten Access Tokens sind maximal 3 Stunden gültig und sind danach wieder unbrauchbar. Der OAuth Prozess müsste dann erneut durchgeführt werden, war es früher noch möglich mit einem Parameter offline_access ein mehrere Monate lange Token zu erzeugen, muss dies nun über einen zusätzlichen Request an Facebook erfolgen.
Dies muss Serverseitig passieren da weitere App Keys /IDs per Parameter angehangen werden müssen, die dann nicht öffentlich sichtbar sein sollten.

https://graph.facebook.com/oauth/access_token?client_id=<client_id>&client_secret=<client_secret>'&grant_type=fb_exchange_token&fb_exchange_token=<access_token>

Parameter Beschreibung
access_token Den zuvor generierten Token nutzen
client_secret auch App Secret genannt, gibt es auf der App Hauptseite. Nicht öffentlich nutzen!

Rückgabe von Facebook bei Erfolg

access_token=AAAGQn8Exxxx&expires=5183560

Rückgabewerte

Wenn der fb_exchange_token Request erfolgreich war gibt es einen neuen access_token mit einem expires Datum, der dann mehrere Monate gültig ist, als HTTP Query-String zurück. Dieses können wir zu Beispiel mit PHP per parse_str in ein Array übergeben. Die Rückgabe sieht dann als Array so aus:

{
access_token: <neuer token>,
expires: 123875
}

Diesen Token kann man irgendwo in seiner Anwendungen nutzen, wenn eine Anfrage an Facebook gesendet werden soll.

Anmerkungen

  • Access Token werden ungültig, wenn ein Facebooknutzer z.B sein Kennwort ändert, also die Anfragen entsprechend abfangen.
  • Werden Einstellungen an der Facebook App über die Developer Oberfläche geändert (besonders im Migrations Tabs), so werden diese nicht immer direkt an alle installierten Apps / Benutzer weitergeleitet, um dieses zu erzwingen sollte man gerade während der Entwicklung die Anwendung einmal komplett vom Account entfernen. Die einfache Anfrage nach neuen Tokens reicht nicht!
  • redirect_uri muss auf dem registrierten Host der Facebook App liegen

Disqus - noscript

danke

I still cant get it working on Enigma2 plugin :S

test

Danke genau das hab ich gesucht!