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


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

мой такой:

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

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

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

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

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

7 83

7 ответов:

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

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

самый простой способ-это

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

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

токен Facebook acess тоже похож "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;
}

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

loginResult.getAccessToken ().getUserId();

с новейшим 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"]);

вы просто должны нажать другой график API:

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

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

в FacebookSDK v2.1 (я не могу проверить старую версию). У нас есть

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

однако согласно комментарию в FacebookSDK

@обсуждение это может быть не заполнено для поведения входа в систему, таких как системная учетная запись iOS.

Так может быть, вы должны проверить, если это доступно, и то ли использовать его, или вызвать запрос, чтобы получить идентификатор пользователя