ChatGPT解决这个技术问题 Extra ChatGPT

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

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

我的流程是这样的:

我使用所有必需的扩展权限将用户发送到 https://graph.facebook.com/oauth/authorize。在我的重定向页面中,我从 Facebook 获取代码。然后我使用我的 API 密钥对 graph.facebook.com/oauth/access_token 执行 HTTP 请求,并在响应中获得访问令牌。

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

如何解决这个问题?


s
serg

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

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

我尝试了上面的确切调用:只返回:{“success”:true}
这不再返回 id 了。使用:https://graph.facebook.com/me?fields=id&access_token=xxxxxx
什么是“access_token”?我尝试使用页面访问令牌和用户访问令牌。我使用这个得到“无效令牌”响应。
@Ant 你需要实现 FaceBook Login 来获取访问令牌
如何获取/获取用户名。我正在使用带有 nodsjs 的 passport-facebook。我的范围是: ['public_profile','user_gender','user_managed_groups','pages_show_list','email'] 而且,在调用 passport-facebook 时,个人资料字段是: profileFields: ['id','name',' email','gender','birthday','displayName','picture.type(large)'] 任何想法,我怎样才能得到用户名? (仅供参考:如果配置文件是 facebook.com/charels.woodson,那么我想要“charels.woodson”)
p
pashaplus

最简单的方法是

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

然后你会得到只包含用户 ID 的 json 响应。


{“错误”:{“消息”:“(#100)未知字段:用户ID。”,“类型”:“OAuthException”,“代码”:100 } }
@NikolayKuznetsov:对不起,在忽略而不是 id 我写了用户 ID,我现在编辑了,请再试一次
没问题,我已经尝试过了,所以我发布了我之前的评论。
我收到以下错误我的访问令牌处于活动状态。 { "error": { "message": "必须使用活动访问令牌来查询当前用户的信息。", "type": "OAuthException", "code": 2500, "fbtrace_id": "HA0UNBRymfa" } }
什么是访问令牌以及从何处获取它
s
sakibmoon

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

它之前完美运行,但在 Facebook 更新到 OAuth2.0 之后。这种方法不能再奏效了。
我希望我已经注意到有关这种方法的警告。今天我们被抓到了,因为访问令牌的格式似乎已经改变了。我强烈建议避免使用这种方法并采用公认的答案。
这是我见过的最有趣的答案:D
另请注意,像这样的方法不会验证给定的用户 ID - 任何人都可以拼接他们想要的任何 ID,并且此代码会盲目信任它。
S
SkyWalker

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

loginResult.getAccessToken().getUserId();


佚名

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

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

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


我只从中获取 provider_id 和名称,但我没有从 facebook 获取用户名。与 link 一样,这是直接打开用户配置文件的用户名,提供者 ID 不起作用。
A
AndrewSmiley

使用最新的 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 的某些部分
G
Gia Dang

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

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

但是根据 FacebookSDK 中的评论

@discussion 这可能不会为 iOS 系统帐户等登录行为填充。

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


c
chavy

查看此 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);
});