web-dev-qa-db-fra.com

Obtenir l'ID d'application à partir du jeton d'accès utilisateur (ou vérifier l'application source pour un jeton)

J'ai trouvé cela question , qui a une réponse, mais Facebook a changé le format de jeton depuis lors, maintenant c'est quelque chose comme:

AAACEdEose0cBACgUMGMCRi9qVbqO3u7mdATQzg[more funny letters]ig8b3uss9WrhGZBYjr20rnJu263BAZDZD

En bref, vous ne pouvez rien en déduire. J'ai également trouvé le débogueur de jeton d'accès , qui montre les informations que je recherche si vous collez un jeton, ce qui est bien, mais ne m'aide pas à le faire par programme.

Le fait est que si quelqu'un obtient un jeton pour un utilisateur, il peut l'utiliser pour accéder au graphique, ce que je fais dans mon application - je veux être sûr que les gens transmettent le jeton qui leur a été émis par mon application, et pas un autre.

Mon flux d'application est:

  1. Obtenez un jeton d'accès depuis Facebook (rien de spécial, de la manière décrite dans ici , Flux côté serveur. (Également iPhone et Android et utilisé, mais ils ont flux similaires si je me souviens bien))
    [appareil] <-> [facebook]
  2. Avec ce jeton d'accès, l'appareil accède à mon serveur d'applications avec le jeton
    [appareil] <-> [Application de Jonathan]
    Sur mon serveur, j'attache le jeton d'accès à l'utilisateur et je l'utilise pour donner des autorisations à cet utilisateur dans mon application. (en utilisant la connexion facebook pour authentifier les utilisateurs)


Ma candidature est sécurisée, et l'accès effectué est également authentifié quel que soit Facebook, MAIS! dans ce flux, le maillon faible que j'ai identifié est que je ne peux pas authentifier avec certitude que le jeton d'accès que j'ai obtenu a été signé pour mon application - je n'aime pas ça parce que je cache les jetons pour une utilisation hors ligne, je veux être sûr à 100% ils sont pour mon application, avec mes permissions.

Alors, quelle sera la (meilleure) façon d'authentifier que le jeton que j'ai obtenu est lié à mon application (pour la relation avec l'utilisateur, j'utilise le jeton pour accéder à/me et voir à quel utilisateur ce jeton est destiné)

Je n'ai pas besoin de déchiffrer le jeton (je suppose que c'est une sorte d'AES), je suis juste à la recherche d'un point de terminaison qui me dira que le jeton correspond à l'ID de mon application.

(EDIT: Utiliser le SDK C #, si cela importe .. Mais un appel graphique/reste pour donner cette information est tout aussi bien :))

58
Jonathan Levison

https://graph.facebook.com/app/?access_token= [user_access_token]

Cela renverra l'application pour laquelle ce jeton a été généré, vous pouvez le comparer avec l'ID de votre application.

60
Daaniel

Le point de terminaison officiel du graphique pour inspecter les jetons d'accès est:

GET graph.facebook.com/debug_token?
      input_token=[user_access_token]&
      access_token=[app_token_or_admin_token]

Exemple de réponse:

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

app_token_or_admin_token peut être obtenu à l'aide de l'appel de l'API Graph:

GET graph.facebook.com/oauth/access_token?
     client_id={app-id}
    &client_secret={app-secret}
    &grant_type=client_credentials

Le point de terminaison debug_token échouera si cet utilisateur_access_token n'appartient pas à l'application qui a généré l'app_token_or_admin_token.

Documentation Facebook pertinente:

24
vially

Une manière documentée de garantir cela consiste à utiliser appsecret_proof .

GET graph.facebook.com/v2.5/me?access_token=[TOKEN]&appsecret_proof=[PROOF]

Cela vérifie non seulement qu'il s'agit d'un jeton valide, mais également que le jeton appartient à l'application. Il vous permet également d'obtenir les données utilisateur en une seule fois.

Vous pouvez dériver PROOF ci-dessus en C # en utilisant ceci (de ici ):

public static string ComputeHmacSha256Hash(string valueToHash, string key)
{
    byte[] keyBytes = Encoding.ASCII.GetBytes(key); 
    byte[] valueBytes = Encoding.ASCII.GetBytes(valueToHash);
    byte[] tokenBytes = new HMACSHA256(keyBytes).ComputeHash(valueBytes);
    valueBytes = null;
    keyBytes = null; 

    StringBuilder token = new StringBuilder();
    foreach (byte b in tokenBytes)
    {
        token.AppendFormat("{0:x2}", b);
    }
    tokenBytes = null; 

    return token.ToString();
}

ComputeHmacSha256Hash(accessToken, appSecret);
5
Nuno Cruces

Pourquoi ne pas utiliser la manière officielle de faire les choses? Voici la demande de la propre vidéo de FB sur la sécurité.

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

Réponse: "data": { "app_id": {token-app-id}, "user_id": {token-user-id}, ... }

Lien vers une vidéo officielle: https://www.facebook.com/FacebookforDevelopers/videos/10152795636318553/

J'ai fait une capture d'écran pour que le temps soit visible, et vous pouvez trouver plus d'informations si vous êtes intéressé.

Facebook video screenshot

4