如何使用访问令牌获取Facebook用户ID


88

我有一个Facebook桌面应用程序,并且正在使用Graph API。我可以获取访问令牌,但是完成之后-我不知道如何获取用户的ID。

我的流程是这样的:

  1. 我使用所有必需的扩展权限将用户发送到https://graph.facebook.com/oauth/authorize

  2. 在我的重定向页面中,我从Facebook获得代码。

  3. 然后,我使用API​​密钥对graph.facebook.com/oauth/access_token执行HTTP请求,并在响应中获得访问令牌。

从那时起,我无法获得用户ID。

这个问题怎么解决?

Answers:


152

如果您想使用Graph API来获取当前用户ID,则只需将请求发送至:

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

1
我尝试了上面的确切调用:只返回:{“ success”:true}
Paul Kenjora '16

3
这不再返回ID。使用:https://graph.facebook.com/me?fields=id&access_token=xxxxxx
M3RS

1
什么是“ access_token”?我尝试使用页面访问令牌和用户访问令牌。我使用此消息获得“无效令牌”响应。
蚂蚁

32

最简单的方法是

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

那么您将获得仅包含用户ID的json响应。


1
{“错误”:{“消息”:“(#100)未知字段:用户ID。”,“类型”:“ OAuthException”,“代码”:100}}
Nikolay Kuznetsov 2012年

1
@NikolayKuznetsov:对不起,我忽略了我而不是id我写了userid,我现在编辑,请再试一次
pashaplus 2012年

1
没问题,我已经尝试过了,所以我发表了以前的评论。
尼古拉·库兹涅佐夫

2
我收到以下错误我的访问令牌已激活。{“ error”:{“ message”:“必须使用活动访问令牌来查询有关当前用户的信息。”,“ type”:“ OAuthException”,“ code”:2500,“ fbtrace_id”:“ HA0UNBRymfa”} }
Ajit Goel

10

Facebook访问令牌看起来也类似“ 1249203702 | 2.h1MTNeLqcLqw __。86400.129394400-605430316 | -WE1iH_CV-afTgyhDPc”

如果使用|提取中间部分 分裂你得到

2.h1MTNeLqcLqw __。86400.129394400-605430316

然后再由-

最后一部分605430316是用户ID。

这是从访问令牌中提取用户ID的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中的更改。从加密的访问令牌中获取用户ID的首选方法如下:

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之前,但之后完美运行。此方法不再起作用。
lucemia 2011年

11
我希望我已注意有关此方法的警告。今天我们陷入困境,因为访问令牌的格式似乎已经变了。我强烈建议您避免使用这种方法,而应采用公认的答案。
托德·梅尼尔

1
多数民众赞成在我见过的最有趣的答案:D
khunshan

还要注意,这样的方法不会验证给定的用户ID-任何人都可以拼接所需的ID,此代码会盲目地信任它。
马特·里昂斯

7

您可以在onSuccess(LoginResult loginResult)上使用以下代码

loginResult.getAccessToken()。getUserId();


6

您只需要点击另一个Graph API:

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

它还将提供您的电子邮件ID和用户ID(对于Facebook)。


我从中只获得了provider_id和名称,但是我没有从Facebook获得用户名。像link一样,这是将直接打开用户个人资料的用户名,提供者ID无效。
Salman Riyaz

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

我有这个主意,但它不只返回用户ID令牌。
亚诺斯

请记住,这个答案是2岁。他们可能已更改了SDK的某些部分
AndrewSmiley

2

在FacebookSDK v2.1中(我无法检查旧版本)。我们有

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

但是根据FacebookSDK的评论

@discussion可能未针对诸如iOS系统帐户之类的登录行为填充此内容。

所以可能是您应该检查它是否可用,然后再使用它,或者调用请求以获取用户ID


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);
});
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.