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:
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?
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"
}
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.
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.
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"
}
}
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 .
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
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)