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?

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

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.


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

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


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


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

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


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);
});
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.