Как получить идентификатор пользователя Facebook с помощью токена доступа

89

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

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

  1. Я отправляю пользователя на https://graph.facebook.com/oauth/authorize со всеми необходимыми расширенными разрешениями.

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

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

С этого момента я не могу получить идентификатор пользователя.

Как решить эту проблему?

Мохох
источник

Ответы:

153

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

https://graph.facebook.com/me?access_token=...
серг
источник
1
Я попробовал точный вызов, приведенный выше: просто возвращает: {"success": true}
Пол Кенджора,
4
Это больше не возвращает идентификатор. Использование:https://graph.facebook.com/me?fields=id&access_token=xxxxxx
M3RS
2
Что такое access_token? Я попытался использовать токен доступа к странице и токен доступа пользователя. Используя это, я получаю ответы "недействительный токен".
Ant
34

Самый простой способ

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

тогда вы получите ответ json, содержащий только идентификатор пользователя.

Pashaplus
источник
1
{"error": {"message": "(# 100) Неизвестные поля: ID пользователя.", "type": "OAuthException", "code": 100}}
Николай Кузнецов
1
@NikolayKuznetsov: извините, чувак, вместо id я написал идентификатор пользователя , сейчас редактировал, попробуйте еще раз
pashaplus
1
Нет проблем, я уже пробовал, поэтому оставляю свой предыдущий комментарий.
Николай Кузнецов
2
Я получаю следующую ошибку. Мой токен доступа активен. {"error": {"message": "Для запроса информации о текущем пользователе должен использоваться активный токен доступа.", "type": "OAuthException", "code": 2500, "fbtrace_id": "HA0UNBRymfa"} }
Аджит Гоэль
что такое токен доступа и где его взять
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
Хотел бы я прислушаться к предупреждению об этом подходе. Сегодня нас поймали со спущенными штанами, потому что совершенно неожиданно изменился формат токенов доступа. Я настоятельно рекомендую избегать этого подхода и следовать принятому ответу.
Todd Menier
2
это самый смешной ответ, который я когда-либо видел: D
khunshan
Также обратите внимание, что такие методы не проверяют данный идентификатор пользователя - любой может вставить любой идентификатор, который хочет, и этот код будет слепо ему доверять.
Мэтт Лайонс
7

Вы можете использовать приведенный ниже код на onSuccess (LoginResult loginResult)

loginResult.getAccessToken (). getUserId ();

Ходящий по небу
источник
6

Вам просто нужно нажать еще один Graph API:

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

Он также предоставит ваш идентификатор электронной почты и идентификатор пользователя (для Facebook).


источник
Я получаю только provider_id и name от этого, но я не получаю имя пользователя из 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);
});
чави
источник