web-dev-qa-db-fra.com

Validation côté serveur du jeton d'accès Facebook pour l'application iPhone

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

Fondamentalement, je pense que cela devrait fonctionner comme ceci:

  1. Dans mon application iPhone, l'utilisateur se connecte à Facebook à l'aide de son email et de son mot de passe.
  2. L'utilisateur autorise l'accès à ses données pour une application Facebook associée.
  3. Mon application iPhone reçoit un jeton d'accès après une connexion réussie.
  4. Lors de la communication ultérieure 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 que ce jeton est valide (et pour qui), et si c'est le cas, le serveur devrait supposer que l'utilisateur est authentifié avec 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 si le jeton est valide pour mon application Facebook.

J'ai essayé beaucoup de requêtes Facebook sur des graphes API, que j'ai trouvé, mais rien n'a fonctionné comme je m'y attendais. Pouvez-vous me donner un exemple?

111
Marcin

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

Je suppose que vous avez déjà le jeton d'accès en main. Dans ce cas, le moyen le 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

Ici, remplacez @accesstoken par le jeton d'accès que vous avez. Je vais décomposer l'URL et expliquerai chacun.

Nous émettons ici une demande d'API graphique qui renverra l'ID 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 expiré, Facebook renverra simplement un message d'erreur.

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

{
   "id": "ID_VALUE"
}
113
Robin

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érez un jeton d'accès aux applications

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

Le point de terminaison de débogage vide essentiellement toutes les informations relatives à un jeton. Il répondra ainsi:

{
    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", une réponse d'erreur est renvoyée.

112
sebastian the crab

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

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

11
Helen Williamson

Dans la dernière version de facebook (2.2), vous pouvez le faire comme suit:

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

Exemple de sortie:

{
    "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"
    }
}
5
Shoeb Ahmed Mogal
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 Kit de développement logiciel (SDK) Facebook pour PHP à partir de GitHub .

2
Baptiste Costa

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, il s'agit d'une fonction Python qui le vérifiera par rapport à son jeton d'accès (une implémentation de Robin La réponse de 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
1
Andrew Magee

Il s'agit de la seule méthode sécurisée permettant de vérifier le jeton de l'utilisateur à l'aide d'une seule demande:

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 avoir rempli 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)

1
Kamoris