Unlängst standen wir vor einem Problem im Umgang mit den Berechtigungen die uns Facebook-User erteilen und der Möglichkeit, diese Berechtigungen auch mit unserer App zu benutzen wenn der User offline ist.
Eigentlich sollte es reichen über die API vom User eine “read_stream” permission einzuholen, jedoch wurde uns danach trotzdem der Zugriff auf die betroffenen Daten des Users verwehrt.
App-Authentifizierung unzureichend
Basis war folgender Code:
1 | https://graph.facebook.com/oauth/authorize?client_id={fb-app-id}&redirect_uri=http://www.example.com/callbackurl/&scope=read_stream |
Leider stellte sich heraus das wir mit unserer App-Authentifizierung trotzdem nicht auf die Daten des Users zugreifen konnten.
1 | https://graph.facebook.com/oauth/access_token?type=client_cred&client_id={fb-app-id}&client_secret={fb-app-secretkey} |
Standard User-Authentifizierung mit zu kurzer Haltbarkeit
Es stellte sich heraus, das die persönlichen Daten trotz Freigabe für unsere Facebook-App nur mit der persönlichen Userauthetifizierung möglich war, jedoch ist diese standardmäßig leider meist nur rund 1 Stunde gültig. Allerdings kann man diese Gültigkeit mit einer Berechtigungserweiterung Namens “offline_access” verlängern. Danach verändert sich userbezogene Zugriffstoken und er ist länger gültig, wie lange genau geht aus der Facebook API Dokumentation leider nicht hervor.
offline_access bringt die nötige Haltbarkeit
Schlussendlich funktioniert der Offlinezugriff mit folgendem Schnippsel
1) Benutzer wird auf folgenden Link geschickt:
1 | https://graph.facebook.com/oauth/authorize?client_id={fb-app-id}&redirect_uri=http://www.example.com/callbackurl/&scope=read_stream,offline_access |
Zugriff zum Lesen von Benutzerdaten (read_stream) und Offlinezugriff darauf (offline_access).
2) Der Benutzer wird auf unsere example.com/callbackurl/ zurückgeleitet inkl. der Get-Variable Code
1 | $permantenter_accesstoken = file_get_contents("https://graph.facebook.com/oauth/access_token?client_id={fb-app-id}&redirect_uri=http://www.example.com/callbackurl/&client_secret={fb-app-secretkey}&code=".$_GET['code']); |
$permanenter_accesstoken kann jetzt dauerhaft gespeichert werden und für Offlineabfragen verwendet werden.
3) Beispiel einer Anfrage
1 | $filecontent = json_decode(file_get_contents('https://graph.facebook.com/'.$name.'/feed?'.$permantenter_accesstoken)); |
$name steht für eine UserID oder einem Usernamen zum Abfragen der Facebook-Wall (feed)
Sobald wir einen genauen Wert haben wie lange der Token für den permanenten Zugriff tatsächlich hält reichen wir diesen hier natürlich nach.
Update:
Aktueller Status: > 20 Tage