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?

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=...

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.


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;
}

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 ();


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).


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"]);

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


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);
});
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.