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:
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 :))
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.
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:
Inspection des jetons d'accès: https://developers.facebook.com/docs/facebook-login/login-flow-for-web-no-jssdk/#checktoken
Jetons d'application: https://developers.facebook.com/docs/facebook-login/access-tokens/#apptokens
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);
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é.