Jak uzyskać identyfikator użytkownika Facebooka za pomocą tokena dostępu

89

Mam aplikację komputerową Facebook i używam Graph API . Jestem w stanie zdobyć token dostępu, ale po tym - nie wiem, jak uzyskać identyfikator użytkownika.

Mój przepływ jest taki:

  1. Wysyłam użytkownika na https://graph.facebook.com/oauth/authorize ze wszystkimi wymaganymi rozszerzonymi uprawnieniami.

  2. Na mojej stronie przekierowującej otrzymuję kod z Facebooka.

  3. Następnie wykonuję żądanie HTTP do graph.facebook.com/oauth/access_token z moim kluczem API i otrzymuję token dostępu w odpowiedzi.

Od tego momentu nie mogę uzyskać identyfikatora użytkownika.

Jak można rozwiązać ten problem?

Mohoch
źródło

Odpowiedzi:

153

Jeśli chcesz użyć Graph API, aby uzyskać bieżący identyfikator użytkownika, po prostu wyślij żądanie do:

https://graph.facebook.com/me?access_token=...
serg
źródło
1
Wypróbowałem dokładnie powyższe wywołanie: po prostu zwraca: {"success": true}
Paul Kenjora,
4
To już nie zwraca id. Użyj:https://graph.facebook.com/me?fields=id&access_token=xxxxxx
M3RS
2
Co to jest „access_token”? Próbowałem użyć tokena dostępu do strony i tokena dostępu użytkownika. Używając tego, otrzymuję odpowiedzi „nieprawidłowy token”.
Ant
34

Najłatwiej jest

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

wtedy otrzymasz odpowiedź json, która zawiera tylko identyfikator użytkownika.

pashaplus
źródło
1
{"error": {"message": "(# 100) Nieznane pola: userid.", "type": "OAuthException", "code": 100}}
Nikolay Kuznetsov
1
@NikolayKuznetsov: przepraszam stary, w przeoczeniu zamiast id napisałem identyfikator użytkownika , edytowałem teraz, spróbuj ponownie
pashaplus
1
Nie ma problemu, już to wypróbowałem, więc zamieszczam mój poprzedni komentarz.
Nikolay Kuznetsov
2
Otrzymuję następujący błąd. Mój token dostępu jest aktywny. {"error": {"message": "Do zapytania o informacje o aktualnym użytkowniku należy użyć aktywnego tokena dostępu.", "type": "OAuthException", "code": 2500, "fbtrace_id": "HA0UNBRymfa"} }
Ajit Goel
jaki jest token dostępu i skąd go wziąć
Prime
10

Token dostępu do Facebooka również wygląda podobnie „1249203702 | 2.h1MTNeLqcLqw __. 86400.129394400-605430316 | -WE1iH_CV-afTgyhDPc”

jeśli wyodrębnisz środkową część za pomocą | się podzielić

2.h1MTNeLqcLqw __. 86400.129394400-605430316

następnie podziel ponownie przez -

ostatnia część 605430316 to identyfikator użytkownika.

Oto kod C # służący do wyodrębniania identyfikatora użytkownika z tokenu dostępu:

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

OSTRZEŻENIE: Struktura tokena dostępu nie jest udokumentowana i może nie zawsze pasować do powyższego wzorca. Używaj go na własne ryzyko.

Aktualizacja Ze względu na zmiany na Facebooku. preferowana metoda pobierania identyfikatora użytkownika z zaszyfrowanego tokena dostępu jest następująca:

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
źródło
5
Działa doskonale przed, ale po aktualizacji Facebooka do OAuth2.0. Ta metoda nie może już działać.
Lucemia,
12
Żałuję, że nie zwróciłem uwagi na ostrzeżenie dotyczące tego podejścia. Zostaliśmy dzisiaj złapani ze spuszczonymi spodniami, ponieważ wydaje się, że nieoczekiwanie zmienił się format tokenów dostępu. Gorąco polecam unikanie tego podejścia i przyjmowanie zaakceptowanej odpowiedzi.
Todd Menier,
2
to najbardziej zabawna odpowiedź, jaką kiedykolwiek widziałem: D
khunshan
Zwróć również uwagę, że metody takie jak ta nie weryfikują podanego identyfikatora użytkownika - każdy może połączyć dowolny identyfikator, a ten kod ślepo by mu zaufał.
Matt Lyons,
7

Możesz użyć poniższego kodu na onSuccess (LoginResult loginResult)

loginResult.getAccessToken (). getUserId ();

SkyWalker
źródło
6

Musisz tylko trafić w inny Graph API:

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

Poda również Twój adres e-mail i identyfikator użytkownika (dla Facebooka).


źródło
Otrzymuję tylko identyfikator dostawcy i nazwę z tego, ale nie otrzymuję nazwy użytkownika z Facebooka. Podobnie jak link , jest to nazwa użytkownika, która bezpośrednio otworzy profil użytkownika, z identyfikatorem dostawcy, który nie działa.
Salman Riyaz
3

W przypadku najnowszego API, oto kod, którego użyłem do tego

/*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
źródło
Wpadłem na pomysł, ale nie zwraca userID tylko token.
János
Pamiętaj, że ta odpowiedź ma 2 lata. Mogli zmienić niektóre części SDK
AndrewSmiley
2

w FacebookSDK v2.1 (nie mogę sprawdzić starszej wersji). Mamy

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

Jednak zgodnie z komentarzem na FacebookuSDK

@discussion To może nie być wypełnione dla zachowań związanych z logowaniem, takich jak konto systemu iOS.

Może więc powinieneś sprawdzić, czy jest dostępny, a następnie użyć go, lub wywołać żądanie uzyskania identyfikatora użytkownika

Gia Dang
źródło
0

Sprawdź tę odpowiedź , która opisuje, jak uzyskać odpowiedź na identyfikator. Najpierw musisz stworzyć metodę get data:

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

Następnie po prostu użyj swojej metody, kiedy chcesz, na przykład:

getFbData(access_token, '/me?fields=id&', (result) => {
      console.log(result);
});
chavy
źródło