Comment vérifier le jeton d'accès Facebook?

108

Il n'y a qu'une chose que le serveur doit faire; vérifiez simplement la validité de tout jeton d'accès.

Les clients envoient au serveur l'ID utilisateur et le jeton d'accès obtenus par FB.getLoginStatus. Comme je m'y attendais, il y aurait n'importe quelle URL qui vérifie la validité du jeton d'accès, comme http://xxx.facebook.com/access_token?=xxxxxxxxxxxxxxxxxxxxxxxxxxxx.

Cela renvoie s'il est disponible ou non ou y a-t-il une API (côté serveur) pour cela?

Alors Jae Kyung
la source
2
Pourquoi ne pas simplement appeler graph.facebook.com/me/permissions?
Igy
3
Il y a une belle interface utilisateur developer.facebook.com/tools/debug/accesstoken
Clergyman

Réponses:

136

La méthode officiellement prise en charge pour cela est:

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

Consultez la documentation relative aux jetons de contrôle pour plus d'informations.

Un exemple de réponse est:

{
    "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
la source
24
Je pense qu'il est trompeur de dire que Facebook est plus susceptible d'introduire des changements de rupture. Ils ne déclarent que nulle part et leurs documents officiels indiquent clairement que c'est le moyen de valider le jeton d'accès
Ed Sykes
1
@rynop, eh bien, le nom du point de terminaison de l'API est "debug_token", et il est décrit dans une section de la documentation de l'API Facebook intitulée Obtenir des informations sur les jetons et le débogage . Cette section de la documentation est référencée par l'ancre HTML #debug et indique que l'API est le back-end de leur outil de débogage. Cela me semble assez clair, mais vous avez raison de dire que techniquement, nulle part il n'est clairement et directement indiqué que la fonction n'est pas destinée à une utilisation en production ... :-)
Jonathan Gilbert
5
Le principal problème ici est que l'utilisation de la méthode me? Access_token est tout simplement erronée si les données proviennent du côté client; puisque n'importe quel site peut pêcher des jetons, puis les utiliser pour s'authentifier sur votre site en accédant à votre api.
srcspider
4
L'OP voulait vérifier l'ID utilisateur associé au jeton. Le point de terminaison / me renvoie l'ID utilisateur, mais uniquement si le jeton d'accès est valide (car, après tout, le jeton est utilisé pour déterminer quel «moi» renvoyer). Alors, saisissez / me et comparez les identifiants d'utilisateurs. Il faut garder à l'esprit que chaque application possède ses propres identifiants utilisateur spécifiques, vous ne pouvez donc pas comparer les identifiants d'une source différente avec le / me que vous obtenez avec le jeton de votre propre application.
Jonathan Gilbert
3
Les documents pouvaient dans le passé avoir des références en utilisant ceci pour le débogage. Mais actuellement, cela suggère que c'est exactement le cas d'utilisation.
AndHeiberg
78

Vous pouvez simplement demander https://graph.facebook.com/me?access_token=xxxxxxxxxxxxxxxxx si vous obtenez une erreur, le jeton n'est pas valide. Si vous obtenez un objet JSON avec une propriété id, il est valide.

Malheureusement, cela ne vous dira que si votre jeton est valide, pas s'il provient de votre application.

Andy Muth
la source
9
Désolé, ma question n'était pas claire. Le problème est de savoir comment vérifier l'utilisateur uniquement avec uid et accessToken. graph.facebook.com/100000726976284?access_token=xxxxxx Par exemple, existe-t-il un moyen simple de vérifier si le jeton d'accès de l'utilisateur 100000726976284 est xxxxxx. Je suppose que le fichier «vérifié» est la clé. Ce n'est que lorsque j'ai mis xxxxxx correct que j'ai pu voir vérifié = vrai dans la réponse.
So Jae Kyung
14
Demandez graph.facebook.com/me?access_token=xxxxxxxxxxxxxxxxx comme mentionné ci-dessus, puis vérifiez que l'uid que vous avez correspond à l'id renvoyé par la demande.
AlexQueue
51
Cela ne vérifiera pas que access_token est pour votre application.
Ed Sykes
Ne fournit pas non plus d' expires_atinformations.
vinesh
4
downvoting, d'accord avec @EdSykes, de cette façon, vous ne pouvez pas vérifier si le jeton d'accès appartient à votre application developer.facebook.com/docs/facebook-login/security
nikis
35

Je voulais juste vous faire savoir que jusqu'à aujourd'hui, j'obtenais d'abord un jeton d'accès à l'application (via une requête GET à Facebook), puis j'utilisais le jeton reçu comme app-token-or-admin-tokendans:

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

Cependant, je viens de réaliser une meilleure façon de faire cela (avec l'avantage supplémentaire d'exiger une requête GET de moins):

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

Comme décrit dans la documentation de Facebook pour les jetons d'accès ici .

Andy
la source
6
Je vous remercie. Remarque pour les autres: le littéral "|" le caractère doit être inclus (qui n'indique pas «ou») comme indiqué sur la page liée à dans la réponse: développeurs.facebook.com
Mike S
1
N'est-ce pas incertain? L'envoi du secret d'application via les paramètres de requête d'URL l'expose à quiconque "au milieu" entre votre serveur et Facebook et HTTPS n'aidera pas, car les URL ne sont pas cryptées. N'importe qui peut simplement «écouter» (sniffer) les requêtes avec des URL au format debug_token et voler les secrets d'application Facebook.
Simeon
1
@Simeon stackoverflow.com/questions/499591/are-https-urls-encrypted C'est assez sécurisé.
Xeing
@Xeing merci, je vois que j'avais une mauvaise impression :) Il semble que la partie hôte de l'URL ne soit pas cryptée.
Simeon
1
Ajout du '|' avec le secret de l'application, j'ai enfin réussi. Sinon, cette API ne fonctionne pas.
Uday
4

Demandez simplement (HTTP GET):

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

C'est tout.

Nadav B
la source
1

Exchange Access Tokenpour Mobile Number and Country Code(côté serveur OU côté client)

Vous pouvez obtenir le mobile numberavec votre access_tokenavec ce API https://graph.accountkit.com/v1.1/me/?access_token=xxxxxxxxxxxx . Peut-être, une fois que vous avez le mobile numberet le id, vous pouvez travailler avec lui pour vérifier l'utilisateur avec votre server & database.

xxxxxxxxxx ci-dessus est le Access Token

Exemple de réponse:

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


Échange Auth Codepour Access Token(côté serveur)

Si vous en avez un à la Auth Codeplace, vous pouvez d'abord obtenir le Access Tokenavec ceci API- https://graph.accountkit.com/v1.1/access_token?grant_type=authorization_code&code=xxxxxxxxxx&access_token=AA|yyyyyyyyyy|zzzzzzzzzz

xxxxxxxxxx, yyyyyyyyyyet zzzzzzzzzzau-dessus sont les Auth Code, App IDet App Secretrespectivement.

Exemple de réponse

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

Remarque - Ceci est préférable sur le server-sidecar le APIrequiert le APP Secretqui n'est pas censé être sharedpour security reasons.

Bonne chance.

Akash
la source