112 votes

Validation côté serveur de la clé d'accès Facebook pour une application iPhone

Je développe une application iPhone, qui est basée sur la communication avec le serveur, et je veux utiliser les mécanismes d'authentification de Facebook.

En gros, je pense que ça devrait fonctionner comme ça :

  1. Dans mon application iPhone, l'utilisateur se connecte à Facebook, en utilisant son adresse électronique et son mot de passe.
  2. L'utilisateur autorise l'accès à ses données pour l'application Facebook correspondante.
  3. Mon application iPhone reçoit un jeton d'accès, après une connexion réussie.
  4. Lors des communications ultérieures avec mon serveur, mon application iPhone doit utiliser le jeton d'accès 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'accès, il doit demander à Facebook si ce jeton est valide (et pour qui), et si oui, le serveur doit supposer que l'utilisateur est authentifié auprès de Facebook.

Ma question est la suivante : comment le serveur doit-il demander à Facebook si le jeton d'accès donné est valide ? Je pense que je devrais vérifier d'une manière ou d'une autre si le jeton est valide pour mon application Facebook.

J'ai essayé de nombreuses requêtes Facebook vers l'API graphique, que j'ai trouvées, mais rien n'a fonctionné comme prévu. Pouvez-vous me fournir un exemple ?

113voto

Robin Jome Points 1477

Mise à jour : cette réponse semble peu sûre puisqu'il ne valide pas le jeton d'abord comme appartenant à votre application, voir les commentaires, réponse originale comme suivante :

Je suppose que vous avez déjà le jeton d'accès en main. Dans ce cas, la façon la plus simple de valider un jeton d'accès est d'émettre la requête suivante

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

Remplacez ici @accesstoken par le jeton d'accès que vous avez. Je vais décomposer l'url et expliquer chaque élément.

Nous émettons ici une demande de graph api qui renverra l'identifiant d'utilisateur Facebook du propriétaire du jeton d'accès sous forme de chaîne JSON. Le mot clé 'me' représente l'utilisateur actuellement connecté ou le propriétaire du jeton d'accès. Pour cette requête, le jeton d'accès est un paramètre obligatoire.

Si le jeton d'accès fourni n'est pas valide ou a expiré, Facebook renverra simplement un message d'erreur quelconque.

Pour un jeton d'accès valide, le résultat ressemblera à ceci

{
   "id": "ID_VALUE"
}

112voto

Voici un processus en deux étapes que vous pouvez utiliser pour valider qu'un jeton d'accès utilisateur appartient à votre application :

1) Générer un jeton d'accès à l'application

( 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'accès 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'accès de l'utilisateur que vous voulez vérifier, et ACCESS_TOKEN est le jeton de votre application que vous avez obtenu à l'étape 1.

Le point d'accès de débogage vide toutes les informations sur un jeton, et répondra donc 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 renverra une réponse d'erreur.

11voto

Une autre solution serait d'utiliser https://graph.facebook.com/app/?access_token=[user_access_token] tel que décrit par Obtenir l'identifiant de l'application à partir du jeton d'accès de l'utilisateur (ou vérifier l'application source pour un jeton) .

Il s'agit d'une fonctionnalité non documentée, mais elle renvoie un JSON contenant l'identifiant 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.

2voto

Baptiste Costa Points 348
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 à l'adresse suivante GitHub .

1voto

Andrew Magee Points 729

Si un utilisateur vous a transmis un UID Facebook qu'il prétend être le sien et que vous voulez vérifier s'il est légitime, voici une fonction Python qui le vérifiera par rapport à son jeton d'accès (une 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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X