Serverseitige Überprüfung des Facebook-Zugriffstokens für die iPhone-App

112

Ich entwickle eine iPhone-Anwendung, die auf der Kommunikation mit dem Server basiert, und möchte Facebook-Authentifizierungsmechanismen verwenden.

Grundsätzlich denke ich, dass es so funktionieren sollte:

  1. In meiner iPhone-App meldet sich der Benutzer mit seiner E-Mail-Adresse und seinem Passwort bei Facebook an.
  2. Der Benutzer ermöglicht den Zugriff auf seine Daten für verwandte Facebook-Anwendungen.
  3. Meine iPhone-App erhält nach erfolgreicher Anmeldung ein Zugriffstoken.
  4. Bei der weiteren Kommunikation mit meinem Server sollte meine iPhone-Anwendung das empfangene Facebook-Zugriffstoken verwenden (z. B. bei Abfragen).
  5. Wenn mein Server eine Anfrage von der iPhone-App mit Zugriffstoken erhält, sollte er Facebook fragen, ob dieses Token gültig ist (und für wen), und wenn ja, sollte der Server davon ausgehen, dass der Benutzer bei Facebook authentifiziert ist.

Meine Frage ist: Wie soll der Server Facebook fragen, ob das angegebene Zugriffstoken gültig ist? Ich denke, ich sollte irgendwie überprüfen, ob das Token für meine Facebook-App gültig ist.

Ich habe viele Facebook-Abfragen zur grafischen Darstellung der API versucht, die ich gefunden habe, aber nichts hat so funktioniert, wie ich es erwartet hatte. Können Sie mir ein Beispiel geben?

Marcin
quelle
5
Sofern sich der Benutzer nicht in FB von der App abgemeldet hat, können Sie das Authentifizierungstoken einfach an den Server senden (ssl hoffnungsvoll). Ist eine einfache Abfrage von "/ me" über die Grafik-API erfolgreich oder fehlgeschlagen?
The Mad Gamer
Sie erhalten eine Antwort von Facebook, dass Ihr Token nicht gültig ist :)
Jean-Luc Godard
1
Ich versuche etwas zu tun, das dem sehr ähnlich ist, was Sie tun. Sie haben diese Frage nie als beantwortet markiert. Haben Sie sie jemals zum Laufen gebracht?
Temppy
Was passiert, wenn das access_token abläuft? sollten wir den Benutzer bitten, sich erneut anzumelden? Ich möchte verstehen, wie man nach Ablauf des Tokens erneut validiert
Debianmaster
@debianmaster es hängt von deiner App-Architektur ab. Wenn Sie den Fall "kein FB-Token - kein Zugriff auf die App" in Betracht ziehen, melden Sie den Benutzer ab. Andernfalls könnten Sie eine "Unlink" -Logik in Betracht ziehen, bei der der Benutzer angemeldet bleibt, die von Facebook empfangenen Informationen jedoch von seinem Konto auf dem Server / Client getrennt werden.
Yevhen Dubinin

Antworten:

115

Hier ist ein zweistufiger Prozess, mit dem Sie überprüfen können, ob ein Benutzerzugriffstoken zu Ihrer App gehört:

1) Generieren Sie ein App Access Token

( https://developers.facebook.com/docs/howtos/login/login-as-app/ )

https://graph.facebook.com/oauth/access_token?
client_id=YOUR_APP_ID
&client_secret=YOUR_APP_SECRET
&grant_type=client_credentials

2) Debuggen Sie das Benutzerzugriffstoken

( https://developers.facebook.com/docs/howtos/login/debugging-access-tokens/ )

https://graph.facebook.com/debug_token?
input_token=INPUT_TOKEN
&access_token=ACCESS_TOKEN

Dabei ist INPUT_TOKEN das Benutzerzugriffstoken, das Sie überprüfen möchten, und ACCESS_TOKEN das Token Ihrer App, das Sie aus Schritt 1 erhalten haben.

Der Debug-Endpunkt gibt im Grunde alle Informationen zu einem Token aus, sodass er wie folgt antwortet:

{
    data: {
        app_id: YOUR_APP_ID,
        is_valid: true,
        metadata: {
            sso: "iphone-safari"
        },
        application: YOUR_APP_NAMESPACE,
        user_id: USER_ID,
        issued_at: 1366236791,
        expires_at: 1371420791,
        scopes: [ ]
    }
}

Wenn dieses Token nicht von "Ihrer App" stammt, wird eine Fehlerantwort zurückgegeben.

Sebastian die Krabbe
quelle
13
Laut Facebook ist dies der richtige Weg, um Token zu überprüfen. Der erste Teil ist jedoch optional, da Sie Ihre App-ID und Ihr Geheimnis anstelle eines Administrators oder App-Tokens verwenden können.
Brandon Zacharie
@BrandonZacharie Sehen Sie nicht, wie Sie dies tun, ich habe es nur mit App-ID und Geheimnis versucht und mir einen Fehler für "input_token parameter required" gegeben
Johnny Z
@JohnnyZ das Eingabetoken ist erforderlich. Im Zugriffstoken liegt die Flexibilität.
Brandon Zacharie
8
@BrandonZacharie Du hast recht, ich habe Eingaben und Zugriffstoken verwirrt bekommen. Um App-ID und Geheimnis zu verwenden, habe ich dies als Parameter mit Pipe als Trennzeichen übergeben: & access_token = APP_ID | APP_SECRET
Johnny Z
2
Der Link oben ist jetzt Entwickler.facebook.com/docs/facebook-login/access-tokens/…
Chris Prince
115

Update: Diese Antwort scheint unsicher zu sein, da das Token nicht zuerst als zu Ihrer App gehörend überprüft wird. Siehe die Kommentare und die ursprüngliche Antwort wie folgt:

Ich gehe davon aus, dass Sie das Zugriffstoken bereits in der Hand haben. In einem solchen Fall besteht die einfachste Möglichkeit, ein Zugriffstoken zu validieren, darin, die folgende Anforderung auszugeben

https://graph.facebook.com/me?fields=id&access_token=@accesstoken

Ersetzen Sie hier @accesstoken durch das Zugriffstoken, das Sie haben. Ich werde die URL aufschlüsseln und jede erklären.

Wir geben hier eine Grafik-API-Anfrage aus, die die Facebook-Benutzer-ID des Besitzers des Zugriffstokens als JSON-Zeichenfolge zurückgibt. Das Schlüsselwort 'ich' steht für den aktuell angemeldeten Benutzer oder den Eigentümer des Zugriffstokens. Für diese Anforderung ist das Zugriffstoken ein obligatorischer Parameter.

Wenn das bereitgestellte Zugriffstoken ungültig ist oder abgelaufen ist, gibt Facebook nur eine Fehlermeldung zurück.

Für ein gültiges Zugriffstoken sieht das Ergebnis irgendwie so aus

{
   "id": "ID_VALUE"
}
Robin
quelle
14
Wäre diese Anforderung nicht erfolgreich, wenn dieser Benutzer ein access_token bereitstellen würde, das zu einer anderen App gehört?
Yuriy Nemtsov
2
Jedes gültige Benutzerzugriffstoken kann verwendet werden (unabhängig davon, zu welcher App es gehört)
Robin
12
@Xiquid Dieser Beitrag ist keine Lösung für das Problem, da nicht überprüft wird, ob das Zugriffstoken zu Ihrer Anwendung gehört.
Kolyunya
12
Ich verstehe nicht, warum diese Antwort die meisten Stimmen hat! Es ist offensichtlich nicht die richtige Lösung. Eigentlich ist der richtige Ansatz das, was "Sebastian die Krabbe" vorgeschlagen hat. Der Endpunkt debug_token wird verwendet, um Informationen über das Token selbst abzufragen. Auf diese Weise können Sie überprüfen, ob das Token zu einer bestimmten Benutzer-ID für eine bestimmte App-ID gehört!
Alex Ntousias
4
Ja, diese Antwort ist nicht richtig. Wenn Sie das Zugriffstoken auf diese Weise überprüfen, kann jemand ein Zugriffstoken von einer anderen Anwendung abrufen und zur Authentifizierung bei Ihrem verwenden.
Jonathan
11

Eine andere Lösung wäre die Verwendung https://graph.facebook.com/app/?access_token=[user_access_token]wie unter Abrufen der Anwendungs-ID vom Benutzerzugriffstoken beschrieben (oder Überprüfen der Quellanwendung für ein Token) .

Dies scheint eine undokumentierte Funktion zu sein, gibt jedoch JSON zurück, das die ID der App enthält, für die das Token generiert wurde. Wenn das Token nicht für Ihre App war, wird eine 400 zurückgegeben.

Helen Williamson
quelle
Wie kann ich die Bewertungen anderer Facebook-Unternehmen erhalten? Was muss ich dafür tun?
Maneesh Rao
6

In der neuesten Version von Facebook (2.2) können Sie dies folgendermaßen tun:

https://developers.facebook.com/docs/graph-api/reference/v2.2/debug_token

Beispielausgabe:

{
    "data": {
        "app_id": "THE APP ID", 
        "application": "APP NAME", 
        "expires_at": 1427245200, 
        "is_valid": true, 
        "scopes": [
        "public_profile", 
        "basic_info", 
        "read_stream", 
        "email", 
        "publish_actions", 
        "read_friendlists", 
        "user_birthday", 
        "user_hometown", 
        "user_location", 
        "user_likes", 
        "user_photos", 
        "user_videos", 
        "user_friends", 
        "user_posts"
        ], 
        "user_id": "THE USER ID"
    }
}
Schuh Ahmed Mogal
quelle
Bedeutet dies, dass Sie diesen fb-Endpunkt bei jeder Anforderung aufrufen müssen? Gibt es nicht einen besseren Weg?
Jdruwe
Dies funktioniert, erfordert jedoch das Zugriffstoken. Zugriffstoken können mit der Antwort 'sebastian the crab' generiert werden, oder wir können einfach appid | appsecret verwenden. Weitere
Informationen
Hier ist ein Beispiel für die Verwendung: stackoverflow.com/a/16947027/32453
Rogerdpack
2
private function facebookRequestMe($access_token)
{
    include_once "facebook.php";

    $facebook = new Facebook(array(
        "appId" => "your_application_id",
        "secret" => "your_application_secret"
    ));
    $facebook->setAccessToken($access_token);
    return $facebook->api("/me", "GET");
}

Sie können das Facebook SDK für PHP von GitHub herunterladen .

Baptiste Costa
quelle
1

Wenn ein Benutzer Ihnen eine Facebook-UID übergeben hat, von der er behauptet, dass sie ihnen gehört, und Sie überprüfen möchten, ob sie legitim ist, ist dies eine Python-Funktion, die sie anhand ihres Zugriffstokens überprüft (eine Implementierung der Antwort von Robin Jome):

def verify_facebook_id(id, access_token):
    import requests
    import simplejson
    params = {'fields': 'id', 'access_token': access_token}
    text = requests.get("https://graph.facebook.com/me", params=params).text
    json = simplejson.loads(text)
    response_id = json["id"]
    return response_id == id
Andrew Magee
quelle
Dies bestätigt nicht, dass das Token leider "für Ihre App" generiert wurde ...
Rogerdpack
1

Dies ist die einzige sichere Methode, um Benutzertoken mit nur einer Anforderung zu überprüfen:

https://graph.facebook.com/debug_token?input_token={token-to-inspect}&access_token={app_id}|{app_secret}

Beachten Sie, dass ein Zeichen "|" in der obigen URL wird nicht als ODER, sondern als Trennzeichen verwendet und muss vorhanden sein, nachdem die anderen Felder ausgefüllt wurden.

Die Antwort lautet wie folgt: JSON sieht folgendermaßen aus:

{
    data: {
        app_id: {app_id},
        application: {app_name},
        expires_at: {some_number},
        is_valid: {true|false}
        scopes: {array_of_permissions},
        user_id: {user_id}
    }
}

Referenz: https://developers.facebook.com/docs/facebook-login/access-tokens/#apptokens (die obige Methode wird am Ende dieses Abschnitts erwähnt)

Kamoris
quelle
Es gibt einen anderen sicheren Weg mit einer Anfrage: stackoverflow.com/a/36555287/32453
rogerdpack
-1

Zusammen mit einem Zugriffstoken sendet Facebook auch einen "expires_in" -Parameter, bei dem es sich um einen Offsetwert handelt. Verwenden Sie diese Option, um zu berechnen, wann das Zugriffstoken als NSDate abläuft. Wenn Sie dann eine Anfrage stellen müssen, vergleichen Sie das aktuelle Datum mit dem Ablaufdatum.

Versuchen Sie auch, die Statuscodes und Antwortzeichenfolgen zu überprüfen, die Facebook zurücksendet.

jcm
quelle