So erhalten Sie die Facebook-Benutzer-ID mithilfe des Zugriffstokens

88

Ich habe eine Facebook-Desktop-Anwendung und verwende die Graph-API . Ich kann das Zugriffstoken abrufen, aber danach kann ich die Benutzer-ID nicht mehr abrufen.

Mein Fluss ist wie folgt:

  1. Ich sende den Benutzer mit allen erforderlichen erweiterten Berechtigungen an https://graph.facebook.com/oauth/authorize .

  2. Auf meiner Weiterleitungsseite erhalte ich den Code von Facebook.

  3. Dann führe ich mit meinem API-Schlüssel eine HTTP-Anfrage an graph.facebook.com/oauth/access_token aus und erhalte das Zugriffstoken in der Antwort.

Ab diesem Zeitpunkt kann ich die Benutzer-ID nicht mehr erhalten.

Wie kann dieses Problem gelöst werden?

Mohoch
quelle

Antworten:

152

Wenn Sie die Graph-API verwenden möchten, um die aktuelle Benutzer-ID abzurufen, senden Sie einfach eine Anfrage an:

https://graph.facebook.com/me?access_token=...
serg
quelle
1
Ich habe den genauen Aufruf oben versucht: gibt nur zurück: {"Erfolg": wahr}
Paul Kenjora
3
Dies gibt keine ID mehr zurück. Verwenden Sie:https://graph.facebook.com/me?fields=id&access_token=xxxxxx
M3RS
1
Was ist das 'access_token'? Ich habe versucht, das Seitenzugriffstoken und das Benutzerzugriffstoken zu verwenden. Ich erhalte damit "ungültige Token" -Antworten.
Ameise
32

Der einfachste Weg ist

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

Dann erhalten Sie eine JSON-Antwort, die nur die Benutzer-ID enthält.

Pashaplus
quelle
1
{"Fehler": {"Nachricht": "(# 100) Unbekannte Felder: Benutzer-ID.", "Typ": "OAuthException", "Code": 100}}
Nikolay Kuznetsov
1
@ NikolayKuznetsov: Entschuldigung Mann, in übersehen anstelle von ID schrieb ich Benutzer-ID , ich bearbeitete jetzt, bitte versuchen Sie es erneut
Pashaplus
1
Kein Problem, ich habe es bereits versucht, also poste ich meinen vorherigen Kommentar.
Nikolay Kuznetsov
2
Ich erhalte die folgende Fehlermeldung: Mein Zugriffstoken ist aktiv. {"error": {"message": "Ein aktives Zugriffstoken muss verwendet werden, um Informationen über den aktuellen Benutzer abzufragen.", "type": "OAuthException", "code": 2500, "fbtrace_id": "HA0UNBRymfa"} }
Ajit Goel
10

Das Facebook-Zugriffstoken sieht ebenfalls ähnlich aus: "1249203702 | 2.h1MTNeLqcLqw __. 86400.129394400-605430316 | -WE1iH_CV-afTgyhDPc"

wenn Sie den Mittelteil mit | extrahieren zu spalten bekommt man

2.h1MTNeLqcLqw __. 86400.129394400-605430316

dann wieder aufteilen durch -

Der letzte Teil 605430316 ist die Benutzer-ID.

Hier ist der C # -Code zum Extrahieren der Benutzer-ID aus dem Zugriffstoken:

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

WARNUNG: Die Struktur des Zugriffstokens ist nicht dokumentiert und passt möglicherweise nicht immer zum obigen Muster. Verwenden Sie es auf eigenes Risiko.

Update Aufgrund von Änderungen in Facebook. Die bevorzugte Methode zum Abrufen der Benutzer-ID vom verschlüsselten Zugriffstoken lautet wie folgt:

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
quelle
5
Es funktioniert perfekt vor, aber nach dem Facebook-Update auf OAuth2.0. Diese Methode kann nicht mehr funktionieren.
Lucemia
11
Ich wünschte, ich hätte die Warnung vor diesem Ansatz beachtet. Wir wurden heute mit heruntergelassenen Hosen erwischt, als sich aus heiterem Himmel das Format der Zugriffstoken geändert zu haben scheint. Ich empfehle dringend, diesen Ansatz zu vermeiden und die akzeptierte Antwort zu wählen.
Todd Menier
1
Das ist die lustigste Antwort, die ich je gesehen habe: D
Khunshan
Beachten Sie auch, dass Methoden wie diese die angegebene Benutzer-ID nicht überprüfen - jeder kann die gewünschte ID einfügen, und dieser Code würde ihm blind vertrauen.
Matt Lyons
7

Sie können den folgenden Code für onSuccess verwenden (LoginResult loginResult)

loginResult.getAccessToken (). getUserId ();

SkyWalker
quelle
6

Sie müssen nur eine andere Graph-API drücken:

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

Es wird auch Ihre E-Mail-ID und Benutzer-ID (für Facebook) geben.


quelle
Ich bekomme nur provider_id und name davon, aber ich bekomme keinen Benutzernamen von Facebook. Like link , Dies ist der Benutzername, der das Benutzerprofil direkt öffnet. Die Provider-ID funktioniert nicht.
Salman Riyaz
3

Mit der neuesten API ist hier der Code, den ich dafür verwendet habe

/*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
quelle
Ich habe die Idee, aber es gibt nicht nur das Token userID zurück.
János
Denken Sie daran, diese Antwort ist 2 Jahre alt. Sie haben möglicherweise einige Teile des SDK geändert
AndrewSmiley
2

in FacebookSDK v2.1 (ältere Version kann nicht überprüft werden). Wir haben

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

Allerdings laut Kommentar in FacebookSDK

@discussion Dies kann möglicherweise nicht für Anmeldeverhalten wie das iOS-Systemkonto ausgefüllt werden.

Vielleicht sollten Sie prüfen, ob es verfügbar ist, und dann, ob Sie es verwenden, oder die Anfrage aufrufen, um die Benutzer-ID zu erhalten

Gia Dang
quelle
0

Schauen Sie sich diese Antwort an , in der beschrieben wird, wie Sie eine ID-Antwort erhalten. Zuerst müssen Sie eine Methode zum Abrufen von Daten erstellen:

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

Verwenden Sie dann einfach Ihre Methode, wann immer Sie möchten:

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