Wie überprüfe ich das Facebook-Zugriffstoken?

108

Es gibt nur eine Sache, die der Server tun muss. Überprüfen Sie einfach die Gültigkeit eines Zugriffstokens.

Clients senden an die Server-Benutzer-ID und das Zugriffstoken, das von erhalten wurde FB.getLoginStatus. Wie ich erwartet hatte, würde es eine URL geben, die die Gültigkeit des Zugriffstokens überprüft, wie z http://xxx.facebook.com/access_token?=xxxxxxxxxxxxxxxxxxxxxxxxxxxx.

Das gibt zurück, ob es verfügbar ist oder nicht oder gibt es eine API (serverseitig) dafür?

Also Jae Kyung
quelle
2
Rufen Sie einfach graph.facebook.com/me/permissions an.
Igy
2
Mögliches Duplikat der serverseitigen Validierung
Flimzy
3
Es gibt eine nette Benutzeroberfläche developer.facebook.com/tools/debug/accesstoken
Clergyman

Antworten:

136

Die offiziell unterstützte Methode hierfür ist:

GET graph.facebook.com/debug_token?
     input_token={token-to-inspect}
     &access_token={app-token-or-admin-token}

Weitere Informationen finden Sie in den Check-Token-Dokumenten .

Eine Beispielantwort lautet:

{
    "data": {
        "app_id": 138483919580948, 
        "application": "Social Cafe", 
        "expires_at": 1352419328, 
        "is_valid": true, 
        "issued_at": 1347235328, 
        "metadata": {
            "sso": "iphone-safari"
        }, 
        "scopes": [
            "email", 
            "publish_actions"
        ], 
        "user_id": 1207059
    }
}
rynop
quelle
24
Ich finde es irreführend zu sagen, dass Facebook eher zu bahnbrechenden Veränderungen führt. Sie geben das nirgendwo an und ihre offiziellen Dokumente machen deutlich, dass dies der Weg ist, um das Zugriffstoken zu validieren
Ed Sykes
1
@rynop, der Name des API-Endpunkts lautet "debug_token" und wird in einem Abschnitt der Facebook-API-Dokumentation mit dem Titel "Informationen zu Tokens und Debugging" beschrieben . Dieser Abschnitt der Dokumentation wird vom HTML-Anker #debug referenziert und gibt an, dass die API das Back-End für das Debug-Tool ist. Scheint mir ziemlich klar zu sein, aber Sie haben Recht, dass technisch nirgendwo nirgends klar und direkt angegeben ist, dass die Funktion nicht für den Produktionsgebrauch bestimmt ist ... :-)
Jonathan Gilbert
5
Das Hauptproblem hierbei ist, dass die Verwendung der Methode me? Access_token einfach falsch ist, wenn die Daten von der Clientseite stammen. Da jede Site nach Token fischen kann, verwenden Sie diese, um sich bei Ihrer Site zu authentifizieren, indem Sie auf Ihre API zugreifen.
srcspider
4
Das OP wollte die dem Token zugeordnete Benutzer-ID überprüfen. Der / me-Endpunkt gibt die Benutzer-ID zurück, jedoch nur, wenn das Zugriffstoken gültig ist (schließlich wird das Token verwendet, um zu bestimmen, welches "ich" zurückgegeben werden soll). Also schnapp dir / mich und vergleiche Benutzer-IDs. Es muss beachtet werden, dass jede App ihre eigenen Benutzer-IDs mit speziellem Gültigkeitsbereich erhält, sodass Sie IDs aus einer anderen Quelle nicht mit denen vergleichen können, die Sie mit dem Token Ihrer eigenen App erhalten.
Jonathan Gilbert
3
Die Dokumente haben in der Vergangenheit möglicherweise Verweise, die dies zum Debuggen verwenden. Derzeit deutet dies jedoch darauf hin, dass dies genau der Anwendungsfall ist.
AndHeiberg
78

Sie können einfach https://graph.facebook.com/me?access_token=xxxxxxxxxxxxxxxxx anfordern. Wenn Sie eine Fehlermeldung erhalten, ist das Token ungültig. Wenn Sie ein JSON-Objekt mit einer id-Eigenschaft erhalten, ist es gültig.

Leider erfahren Sie nur, ob Ihr Token gültig ist, nicht, ob es von Ihrer App stammt.

Andy Muth
quelle
9
Entschuldigung, meine Frage war nicht klar. Das Problem besteht darin, den Benutzer nur mit uid und accessToken zu überprüfen. graph.facebook.com/100000726976284?access_token=xxxxxx Gibt es beispielsweise eine einfache Möglichkeit zu überprüfen, ob das Zugriffstoken des Benutzers 100000726976284 xxxxxx ist. Ich denke, das 'verifizierte' Feld ist der Schlüssel. Nur wenn ich xxxxxx richtig eingefügt habe, konnte ich in der Antwort verified = true sehen.
Also Jae Kyung
14
Fordern Sie graph.facebook.com/me?access_token=xxxxxxxxxxxxxxxxx wie oben erwähnt an und überprüfen Sie dann, ob die von Ihnen angegebene UID mit der von der Anfrage zurückgegebenen ID übereinstimmt.
AlexQueue
51
Dadurch wird nicht überprüft, ob das access_token für Ihre App bestimmt ist.
Ed Sykes
Auch keine expires_atInformationen zur Verfügung stellen.
Vinesh
4
Downvoting, stimme @EdSykes zu, auf diese Weise kannst du nicht überprüfen, ob das Zugriffstoken zu deinen App- Entwicklern gehört.
facebook.com/docs/facebook-login/security
35

Ich wollte Sie nur wissen lassen, dass ich bis heute zuerst ein App-Zugriffstoken (über eine GET-Anfrage an Facebook) erhalten und dann das empfangene Token als app-token-or-admin-tokenIn verwendet habe:

GET graph.facebook.com/debug_token?
    input_token={token-to-inspect}
    &access_token={app-token-or-admin-token}

Ich habe jedoch gerade einen besseren Weg gefunden, dies zu tun (mit dem zusätzlichen Vorteil, dass eine GET-Anfrage weniger erforderlich ist):

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

Wie in der Facebook-Dokumentation für Access Tokens hier beschrieben .

Andy
quelle
6
Danke dir. Hinweis für andere: das wörtliche "|" Das Zeichen muss enthalten sein (ohne 'oder' anzugeben), wie auf der Seite gezeigt, auf die in der Antwort verwiesen wird: developer.facebook.com/docs/facebook-login/…
Mike S
1
Ist das nicht unsicher? Das Senden des App-Geheimnisses über URL-Abfrageparameter macht es für jeden "in der Mitte" zwischen Ihrem Server und Facebook verfügbar, und HTTPS hilft nicht weiter, da URLs nicht verschlüsselt sind. Jeder kann einfach mit URLs im debug_token-Format auf Anfragen "warten" (schnüffeln) und Facebook-App-Geheimnisse stehlen.
Simeon
1
@Simeon stackoverflow.com/questions/499591/are-https-urls-encrypted Es ist ziemlich sicher.
Xeing
@Xeing danke, ich sehe, ich hatte den falschen Eindruck :) Es scheint, dass nur der Host-Teil der URL nicht verschlüsselt ist.
Simeon
1
Hinzufügen des '|' Mit dem App-Geheimnis habe ich endlich angefangen. Andernfalls funktioniert diese API nicht.
Uday
4

Einfach anfordern (HTTP GET):

https://graph.facebook.com/USER_ID/access_token=xxxxxxxxxxxxxxxxx

Das ist es.

Nadav B.
quelle
1

Austausch Access Tokenfür Mobile Number and Country Code(Server- ODER Client-Seite)

Sie können das bekommen mobile numbermit Ihrem access_tokenmit diesem API https://graph.accountkit.com/v1.1/me/?access_token=xxxxxxxxxxxx . Vielleicht können Sie, sobald Sie das mobile numberund das haben id, damit arbeiten, um den Benutzer mit Ihrem zu verifizierenserver & database .

xxxxxxxxxx oben ist die Access Token

Beispielantwort:

{
   "id": "61940819992708",
   "phone": {
      "number": "+91XX82923912",
      "country_prefix": "91",
      "national_number": "XX82923912"
   }
}


Austausch Auth Codefür Access Token(Serverseite)

Wenn Sie Auth Codestattdessen eine haben, können Sie zuerst die bekommenAccess Token mit folgender Adresse abrufenAPI : https://graph.accountkit.com/v1.1/access_token?grant_type=authorization_code&code=xxxxxxxxxx&access_token=AA|yyyyyyyyyy|zzzzzzzzzz

xxxxxxxxxx, yyyyyyyyyyundzzzzzzzzzz oben sind Auth Code, App IDund App Secretjeweils.

Beispielantwort

{
   "id": "619XX819992708",
   "access_token": "EMAWdcsi711meGS2qQpNk4XBTwUBIDtqYAKoZBbBZAEZCZAXyWVbqvKUyKgDZBniZBFwKVyoVGHXnquCcikBqc9ROF2qAxLRrqBYAvXknwND3dhHU0iLZCRwBNHNlyQZD",
   "token_refresh_interval_sec": XX92000
}

Hinweis - Dies wird bevorzugt, server-sideda dies APIerforderlich istAPP Secret , die nicht gemeint sein , sharedfürsecurity reasons .

Viel Glück.

Akash
quelle