Jeton d’access Facebook validation côté serveur pour application iPhone

Je développe une application iPhone basée sur la communication avec le serveur et je souhaite utiliser des mécanismes d’authentification Facebook.

Fondamentalement, je pense que cela devrait fonctionner comme ceci:

  1. Dans mon application iPhone, l’utilisateur se connecte à Facebook en utilisant son adresse e-mail et son mot de passe.
  2. L’utilisateur permet d’accéder à ses données pour l’application Facebook associée.
  3. Mon application iPhone reçoit un jeton d’access, une fois la connexion établie.
  4. Dans une communication ultérieure avec mon serveur, mon application iPhone doit utiliser le jeton d’access Facebook reçu (par exemple: dans les requêtes).
  5. Lorsque mon serveur reçoit une requête de l’application iPhone, avec un jeton d’access, il doit demander à Facebook que ce jeton est valide (et pour qui), et si oui, le serveur doit supposer que l’utilisateur est authentifié avec Facebook.

Ma question est la suivante: comment le serveur devrait-il demander à Facebook si un jeton d’access donné est valide? Je pense que je devrais vérifier si le jeton est valide pour mon application Facebook.

J’ai essayé de nombreuses requêtes Facebook pour représenter graphiquement les API, que j’ai trouvées, mais rien ne fonctionnait comme prévu. Pouvez-vous me donner un exemple?

Mise à jour: cette réponse semble peu sûre car elle ne valide pas le jeton comme appartenant à votre application, voir les commentaires, réponse originale comme suit:

Je suppose que vous avez déjà le jeton d’access en main. Dans un tel cas, le moyen le plus simple de valider un jeton d’access est de lancer la requête suivante:

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

Ici, remplacez @accesstoken par le jeton d’access que vous avez. Je vais décomposer l’url et expliquera chacun.

Nous émettons ici une demande d’API graphique qui renverra l’identifiant Facebook du propriétaire du jeton d’access en tant que chaîne JSON. Le mot clé “moi” représente l’utilisateur actuellement connecté ou le propriétaire du jeton d’access. Car ce jeton d’access à la requête est un paramètre obligatoire.

Si le jeton d’access fourni n’est pas valide ou expiré, Facebook renverra simplement un message d’erreur quelconque.

Pour un jeton d’access valide, le résultat ressemblera à celui-ci

 { "id": "ID_VALUE" } 

Voici un processus en deux étapes que vous pouvez utiliser pour valider qu’un jeton d’access utilisateur appartient à votre application:

1) Générer un jeton Access App

( 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) Déboguer le jeton d’access utilisateur

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

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

Où INPUT_TOKEN est le jeton d’access utilisateur que vous souhaitez vérifier et ACCESS_TOKEN est le jeton de votre application obtenu à l’étape 1.

Le sharepoint terminaison de débogage vide essentiellement toutes les informations sur un jeton, de sorte qu’il réagira avec quelque chose comme ceci:

 { 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: [ ] } } 

Si ce jeton ne provient pas de “votre application”, il retournera une réponse d’erreur.

Une autre solution consisterait à utiliser https://graph.facebook.com/app/?access_token=[user_access_token] comme décrit dans Obtenir l’identifiant de l’application à partir du jeton d’access utilisateur (ou à vérifier l’application source pour un jeton) .

Cela semble être une fonctionnalité non documentée, mais retourne JSON contenant l’ID de l’application pour laquelle le jeton a été généré. Si le jeton n’était pas destiné à votre application, il renvoie un 400.

Dans la dernière version de facebook (2.2), vous pouvez le faire de cette façon:

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

Sortie de l’échantillon:

 { "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" } } 
 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"); } 

Vous pouvez télécharger le SDK Facebook pour PHP depuis GitHub .

Si un utilisateur vous a passé un UID Facebook qu’il prétend être le leur et que vous voulez vérifier s’il est légitime, il s’agit d’une fonction Python qui le vérifiera par rapport à son jeton d’access (implémentation de la réponse de 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 

C’est la seule méthode sécurisée pour vérifier le jeton utilisateur en utilisant une seule requête:

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

Notez qu’un signe “|” dans l’URL ci-dessus n’est pas utilisé comme OR mais comme séparateur et doit être là après remplir les autres champs.

La réponse sera JSON ressemblant à ça:

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

Référence: https://developers.facebook.com/docs/facebook-login/access-tokens/#apptokens (la méthode ci-dessus est mentionnée au bas de cette section)

Avec un jeton d’access, Facebook envoie également un paramètre “expires_in”, qui est une valeur de décalage. Utilisez cela pour calculer le moment où le jeton d’access expirera en tant que NSDate. Ensuite, lorsque vous devez faire une demande, comparez la date actuelle à la date d’expiration.

Essayez également d’inspecter les codes d’état et les chaînes de réponse que Facebook renvoie.