Come ottenere l'ID utente di Facebook utilizzando il token di accesso


88

Ho un'applicazione desktop Facebook e sto utilizzando l' API Graph . Sono in grado di ottenere il token di accesso, ma dopo che è stato fatto, non so come ottenere l'ID dell'utente.

Il mio flusso è così:

  1. Invio l'utente a https://graph.facebook.com/oauth/authorize con tutte le autorizzazioni estese richieste.

  2. Nella mia pagina di reindirizzamento ottengo il codice da Facebook.

  3. Quindi eseguo una richiesta HTTP a graph.facebook.com/oauth/access_token con la mia chiave API e ottengo il token di accesso nella risposta.

Da quel momento in poi non riesco a ottenere l'ID utente.

Come si risolve questo problema?

Risposte:


152

Se desideri utilizzare l'API Graph per ottenere l'ID utente corrente, invia una richiesta a:

https://graph.facebook.com/me?access_token=...

1
Ho provato la chiamata esatta sopra: restituisce solo: {"success": true}
Paul Kenjora

3
Questo non restituisce più l'ID. Usa:https://graph.facebook.com/me?fields=id&access_token=xxxxxx
M3RS

1
Cos'è "access_token"? Ho provato a utilizzare il token di accesso alla pagina e il token di accesso utente. Ottengo risposte "token non valido" utilizzando questo.
Ant

32

Il modo più semplice è

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

quindi otterrai una risposta json che contiene solo userid.


1
{"error": {"message": "(# 100) Campi sconosciuti: userid.", "type": "OAuthException", "code": 100}}
Nikolay Kuznetsov

1
@NikolayKuznetsov: mi dispiace amico, in trascurare invece di id ho scritto userid , l'ho modificato ora, per favore riprova
pashaplus

1
Nessun problema, l'ho già provato, quindi inserisco il mio commento precedente.
Nikolay Kuznetsov

2
Ricevo il seguente errore Il mio token di accesso è attivo. {"error": {"message": "È necessario utilizzare un token di accesso attivo per richiedere informazioni sull'utente corrente.", "type": "OAuthException", "code": 2500, "fbtrace_id": "HA0UNBRymfa"} }
Ajit Goel

10

Anche il token di accesso a Facebook ha un aspetto simile "1249203702 | 2.h1MTNeLqcLqw __. 86400.129394400-605430316 | -WE1iH_CV-afTgyhDPc"

se estrai la parte centrale usando | per dividere si ottiene

2.h1MTNeLqcLqw __. 86400.129394400-605430316

poi diviso di nuovo da -

l'ultima parte 605430316 è l'id utente.

Ecco il codice C # per estrarre l'id utente dal token di accesso:

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

AVVERTIMENTO: la struttura del token di accesso non è documentata e potrebbe non adattarsi sempre allo schema precedente. Usalo a tuo rischio.

Aggiornamento a causa di modifiche in Facebook. il metodo preferito per ottenere l'ID utente dal token di accesso crittografato è il seguente:

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
Funziona perfettamente prima, ma dopo l'aggiornamento di Facebook a OAuth2.0. Questo metodo non può più funzionare.
lucemia

11
Vorrei aver ascoltato l'avvertimento su questo approccio. Oggi siamo stati scoperti con i pantaloni abbassati perché di punto in bianco il formato dei gettoni di accesso sembra essere cambiato. Consiglio vivamente di evitare questo approccio e di seguire la risposta accettata.
Todd Menier

1
questa è la risposta più divertente che abbia mai visto: D
khunshan

Si noti inoltre che metodi come questo non verificano l'ID utente specificato: chiunque potrebbe unire qualsiasi ID desidera e questo codice si fiderebbe ciecamente di esso.
Matt Lyons

7

È possibile utilizzare il codice sottostante su onSuccess (LoginResult loginResult)

loginResult.getAccessToken (). getUserId ();


6

Devi solo premere un'altra API Graph:

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

Fornirà anche l'ID e-mail e l'ID utente (per Facebook).


Sto ottenendo solo provider_id e nome da quello, ma non ottengo il nome utente da Facebook. Come il collegamento , questo è il nome utente che aprirà direttamente il profilo dell'utente, con l'ID del provider non funziona.
Salman Riyaz

3

Con l'API più recente, ecco il codice che ho usato per questo

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

Ho avuto l'idea, ma non restituisce userID solo il token.
János

Tieni presente che questa risposta è di 2 anni. Potrebbero aver modificato alcune parti dell'SDK
AndrewSmiley

2

in FacebookSDK v2.1 (non riesco a controllare la versione precedente). abbiamo

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

Tuttavia secondo il commento in FacebookSDK

@discussion Potrebbe non essere compilato per comportamenti di accesso come l'account di sistema iOS.

Quindi potrebbe essere necessario verificare se è disponibile, quindi se utilizzarlo o chiamare la richiesta per ottenere l'ID utente


0

Dai un'occhiata a questa risposta , che descrive come ottenere una risposta ID. Innanzitutto, è necessario creare il metodo per ottenere i dati:

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

Quindi usa semplicemente il tuo metodo quando vuoi, in questo modo:

getFbData(access_token, '/me?fields=id&', (result) => {
      console.log(result);
});
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.