Як отримати ідентифікатор користувача Facebook за допомогою маркера доступу


89

У мене є настільна програма Facebook і я використовую API Graph . Я можу отримати маркер доступу, але після цього - я не знаю, як отримати ідентифікатор користувача.

Мій потік такий:

  1. Я надсилаю користувача на https://graph.facebook.com/oauth/authorize з усіма необхідними розширеними дозволами.

  2. На своїй сторінці переадресації я отримую код від Facebook.

  3. Потім я виконую запит HTTP до graph.facebook.com/oauth/access_token за допомогою мого ключа API, і я отримую маркер доступу у відповіді.

З цього моменту я не можу отримати ідентифікатор користувача.

Як можна вирішити цю проблему?

Відповіді:


153

Якщо ви хочете використовувати API Graph для отримання поточного ідентифікатора користувача, просто надішліть запит на адресу:

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

1
Я спробував точний дзвінок вище: just
return

4
Це більше не повертає ідентифікатор. Використання:https://graph.facebook.com/me?fields=id&access_token=xxxxxx
M3RS

2
Що таке 'access_token'? Я спробував використовувати маркер доступу до сторінки та маркер доступу користувача. За допомогою цього я отримую відповіді на "недійсні маркери".
Мураха

34

Найпростіший спосіб

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

тоді ви отримаєте відповідь json, яка містить лише ідентифікатор користувача.


1
{"error": {"message": "(# 100) Невідомі поля: userid.", "type": "OAuthException", "code": 100}}
Микола Кузнєцов

1
@NikolayKuznetsov: вибачте, випускаю замість ідентифікатора я написав userid , я відредагував зараз, спробуйте ще раз
pashaplus

1
Немає проблем, я вже спробував, тому розміщу свій попередній коментар.
Микола Кузнєцов

2
Я отримую таку помилку. Мій маркер доступу активний. {"error": {"message": "Активний маркер доступу повинен використовуватися для запиту інформації про поточного користувача.", "type": "OAuthException", "code": 2500, "fbtrace_id": "HA0UNBRymfa"} }
Ajit Goel

що таке маркер доступу та звідки його взяти
Prime

10

Токен доступу до facebook теж схожий на "1249203702 | 2.h1MTNeLqcLqw __. 86400.129394400-605430316 | -WE1iH_CV-afTgyhDPc"

якщо ви витягнете середню частину за допомогою | розділити ви отримуєте

2.h1MTNeLqcLqw __. 86400.129394400-605430316

потім знову розділити на -

остання частина 605430316 - це ідентифікатор користувача.

Ось код C # для вилучення ідентифікатора користувача з маркера доступу:

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

ПОПЕРЕДЖЕННЯ: Структура маркера доступу є бездокументарною і не завжди може відповідати шаблону вище. Використовуйте його на свій страх і ризик.

Оновлення через зміни у Facebook. кращий метод отримання ідентифікатора користувача із зашифрованого маркера доступу такий:

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
Це чудово працює і раніше, але після оновлення Facebook до OAuth2.0. Цей метод вже не може працювати.
люцемія

12
Я би хотів, щоб я прислухався до попередження щодо такого підходу. Сьогодні нас спіймали з заниженими штанами, оскільки, здавалося б, формат жетонів доступу змінився. Я настійно рекомендую уникати такого підходу і йти з прийнятою відповіддю.
Тодд Меньє,

2
це найсмішніша відповідь, яку я коли-небудь бачив: D
khunshan

Також зауважте, що подібні методи не перевіряють даний ідентифікатор користувача - будь-хто може зрощувати будь-який ідентифікатор, який хоче, і цей код сліпо йому довіряє.
Matt Lyons,

7

Ви можете використовувати наведений нижче код на onSuccess (LoginResult loginResult)

loginResult.getAccessToken (). getUserId ();


6

Вам просто потрібно натиснути на інший графічний API:

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

Він також надасть ідентифікатор електронної пошти та ідентифікатор користувача (для Facebook).


Я отримую лише ідентифікатор provider_id та ім'я з цього, але я не отримую ім'я користувача з facebook. Як і посилання , це ім'я користувача, яке безпосередньо відкриє профіль користувачів, з ідентифікатором провайдера він не працює.
Салман Ріяз

3

З найновішим API, ось код, який я використовував для нього

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

Я зрозумів ідею, але вона не повертає userID лише маркер.
Янош,

Майте на увазі, що цій відповіді 2 роки. Можливо, вони змінили деякі частини SDK
AndrewSmiley

2

у FacebookSDK v2.1 (я не можу перевірити стару версію). Ми маємо

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

Однак, згідно з коментарем у FacebookSDK

@discussion Це може бути не заповнено для поведінки під час входу, наприклад, для системного облікового запису iOS.

Можливо, вам слід перевірити, чи він доступний, а потім чи використовувати його, або викликати запит, щоб отримати ідентифікатор користувача


0

Ознайомтеся з цією відповіддю , яка описує, як отримати відповідь ID. Спочатку вам потрібно створити метод отримання даних:

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

Тоді просто використовуйте свій метод, коли завгодно, наприклад:

getFbData(access_token, '/me?fields=id&', (result) => {
      console.log(result);
});
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.