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

时间:2010-08-23 10:28:49

标签: facebook facebook-graph-api

我有一个Facebook桌面应用程序,正在使用Graph API。 我能够获得访问令牌,但在此之后 - 我不知道如何获取用户的ID。

我的流程是这样的:

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

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

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

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

    如何解决这个问题?

8 个答案:

答案 0 :(得分:145)

如果您想使用Graph API获取当前用户ID,请发送请求到:

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

答案 1 :(得分:27)

最简单的方法是

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

然后你会得到只包含userid的json响应。

答案 2 :(得分:9)

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的变化。 从加密访问令牌获取userid的首选方法如下:

try
{
    var fb = new FacebookClient(accessToken);
    var result = (IDictionary<string, object>)fb.Get("/me?fields=id");
    return (string)result["id"];
}
catch (FacebookOAuthException)
{
    return null;
}

答案 3 :(得分:7)

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

  

loginResult.getAccessToken()getUserId();

答案 4 :(得分:6)

您只需要点击另一个图谱API:

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

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

答案 5 :(得分:3)

使用最新的API,这里是我使用的代码

{{1}}

答案 6 :(得分:2)

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

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

但根据FacebookSDK的评论

@discussion可能无法填充登录行为,例如iOS系统帐户。

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

答案 7 :(得分:0)

查看此answer,其中介绍了如何获取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);
});