Comment obtenir l'identifiant de l'utilisateur Facebook à l'aide du jeton d'accès

88

J'ai une application de bureau Facebook et j'utilise l' API Graph . Je peux obtenir le jeton d'accès, mais après cela, je ne sais pas comment obtenir l'identifiant de l'utilisateur.

Mon flux est comme ceci:

  1. J'envoie l'utilisateur à https://graph.facebook.com/oauth/authorize avec toutes les autorisations étendues requises.

  2. Dans ma page de redirection, je reçois le code de Facebook.

  3. Ensuite, j'effectue une requête HTTP à graph.facebook.com/oauth/access_token avec ma clé API et j'obtiens le jeton d'accès dans la réponse.

À partir de ce moment, je ne peux pas obtenir l'ID utilisateur.

Comment résoudre ce problème?

Mohoch
la source

Réponses:

152

Si vous souhaitez utiliser l'API Graph pour obtenir l'ID utilisateur actuel, envoyez simplement une demande à:

https://graph.facebook.com/me?access_token=...
serg
la source
1
J'ai essayé l'appel exact ci-dessus: renvoie simplement: {"success": true}
Paul Kenjora
3
Cela ne renvoie plus d'identifiant. Utilisation:https://graph.facebook.com/me?fields=id&access_token=xxxxxx
M3RS
1
Qu'est-ce que le 'access_token'? J'ai essayé d'utiliser le jeton d'accès à la page et le jeton d'accès utilisateur. J'obtiens des réponses «jeton invalide» en utilisant ceci.
Ant
32

Le moyen le plus simple est

https://graph.facebook.com/me?fields=id&access_token="xxxxx"

alors vous obtiendrez une réponse json qui ne contient que l'ID utilisateur.

pashaplus
la source
1
{"error": {"message": "(# 100) Champs inconnus: userid.", "type": "OAuthException", "code": 100}}
Nikolay Kuznetsov
1
@NikolayKuznetsov: désolé mec, dans négliger au lieu d' id j'ai écrit userid , j'ai édité maintenant, veuillez réessayer
pashaplus
1
Pas de problème, je l'ai déjà essayé, je poste donc mon précédent commentaire.
Nikolay Kuznetsov
2
J'obtiens l'erreur suivante Mon jeton d'accès est actif. {"error": {"message": "Un jeton d'accès actif doit être utilisé pour demander des informations sur l'utilisateur actuel.", "type": "OAuthException", "code": 2500, "fbtrace_id": "HA0UNBRymfa"} }
Ajit Goel
10

Le jeton d'accès Facebook est également similaire "1249203702 | 2.h1MTNeLqcLqw __. 86400.129394400-605430316 | -WE1iH_CV-afTgyhDPc"

si vous extrayez la partie médiane en utilisant | pour diviser vous obtenez

2.h1MTNeLqcLqw __. 86400.129394400-605430316

puis divisé à nouveau par -

la dernière partie 605430316 est l'identifiant de l'utilisateur.

Voici le code C # pour extraire l'ID utilisateur du jeton d'accès:

   public long ParseUserIdFromAccessToken(string accessToken)
   {
        Contract.Requires(!string.isNullOrEmpty(accessToken);

        /*
         * access_token:
         *   1249203702|2.h1MTNeLqcLqw__.86400.129394400-605430316|-WE1iH_CV-afTgyhDPc
         *                                               |_______|
         *                                                   |
         *                                                user id
         */

        long userId = 0;

        var accessTokenParts = accessToken.Split('|');

        if (accessTokenParts.Length == 3)
        {
            var idPart = accessTokenParts[1];
            if (!string.IsNullOrEmpty(idPart))
            {
                var index = idPart.LastIndexOf('-');
                if (index >= 0)
                {
                    string id = idPart.Substring(index + 1);
                    if (!string.IsNullOrEmpty(id))
                    {
                        return id;
                    }
                }
            }
        }

        return null;
    }

AVERTISSEMENT: la structure du jeton d'accès n'est pas documentée et peut ne pas toujours correspondre au modèle ci-dessus. Utilisez à vos risques et périls.

Mise à jour en raison de changements dans Facebook. la méthode préférée pour obtenir l'ID utilisateur du jeton d'accès chiffré est la suivante:

try
{
    var fb = new FacebookClient(accessToken);
    var result = (IDictionary<string, object>)fb.Get("/me?fields=id");
    return (string)result["id"];
}
catch (FacebookOAuthException)
{
    return null;
}
prabir
la source
5
Cela fonctionne parfaitement avant, mais après la mise à jour de Facebook vers OAuth2.0. Cette méthode ne peut plus fonctionner.
lucemia le
11
J'aurais aimé tenir compte de l'avertissement concernant cette approche. Nous avons été pris avec nos pantalons baissés aujourd'hui car à l'improviste, le format des jetons d'accès semble avoir changé. Je recommande vivement d'éviter cette approche et de suivre la réponse acceptée.
Todd Menier
1
c'est la réponse la plus drôle que j'ai jamais vue: D
khunshan
Notez également que des méthodes comme celle-ci ne vérifient pas l'ID utilisateur donné - n'importe qui peut épisser l'id qu'il veut et ce code lui ferait confiance aveuglément.
Matt Lyons
7

Vous pouvez utiliser le code ci-dessous sur onSuccess (LoginResult loginResult)

loginResult.getAccessToken (). getUserId ();

SkyWalker
la source
6

Il vous suffit de frapper une autre API Graph:

https://graph.facebook.com/me?access_token={access-token}

Il donnera également votre adresse e-mail et votre identifiant d'utilisateur (pour Facebook).


la source
Je ne reçois que le provider_id et le nom de cela, mais je ne reçois pas le nom d'utilisateur de Facebook. Comme le lien , c'est le nom d'utilisateur qui ouvrira directement le profil des utilisateurs, avec l'identifiant du fournisseur, cela ne fonctionne pas.
Salman Riyaz
3

Avec la dernière API, voici le code que j'ai utilisé pour cela

/*params*/
NSDictionary *params = @{
                         @"access_token": [[FBSDKAccessToken currentAccessToken] tokenString],
                         @"fields": @"id"
                         };
/* make the API call */
FBSDKGraphRequest *request = [[FBSDKGraphRequest alloc]
                              initWithGraphPath:@"me"
                              parameters:params
                              HTTPMethod:@"GET"];

[request startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection,
                                      id result,
                                      NSError *error) {
    NSDictionary *res = result;
    //res is a dict that has the key
    NSLog([res objectForKey:@"id"]);
AndrewSmiley
la source
J'ai eu l'idée, mais elle ne renvoie pas l'ID utilisateur uniquement le jeton.
János
Gardez à l'esprit que cette réponse date de 2 ans. Ils ont peut-être changé certaines parties du SDK
AndrewSmiley
2

dans FacebookSDK v2.1 (je ne peux pas vérifier l'ancienne version). Nous avons

NSString *currentUserFBID = [FBSession activeSession].accessTokenData.userID;

Cependant, selon le commentaire dans FacebookSDK

@discussion Ceci peut ne pas être renseigné pour les comportements de connexion tels que le compte système iOS.

Vous devriez peut-être vérifier s'il est disponible, puis si vous l'utilisez ou appelez la demande pour obtenir l'ID utilisateur

Gia Dang
la source
0

Consultez cette réponse , qui décrit comment obtenir une réponse ID. Tout d'abord, vous devez créer une méthode pour obtenir des données:

const https = require('https');
getFbData = (accessToken, apiPath, callback) => {
    const options = {
        host: 'graph.facebook.com',
        port: 443,
        path: `${apiPath}access_token=${accessToken}`, // apiPath example: '/me/friends'
        method: 'GET'
    };

    let buffer = ''; // this buffer will be populated with the chunks of the data received from facebook
    const request = https.get(options, (result) => {
        result.setEncoding('utf8');
        result.on('data', (chunk) => {
            buffer += chunk;
        });

        result.on('end', () => {
            callback(buffer);
        });
    });

    request.on('error', (e) => {
        console.log(`error from facebook.getFbData: ${e.message}`)
    });

    request.end();
}

Ensuite, utilisez simplement votre méthode quand vous le souhaitez, comme ceci:

getFbData(access_token, '/me?fields=id&', (result) => {
      console.log(result);
});
chavy
la source