如何使用访问令牌获取 Facebook 用户 ID
Posted
技术标签:
【中文标题】如何使用访问令牌获取 Facebook 用户 ID【英文标题】:How to get the Facebook user id using the access token 【发布时间】:2011-04-02 13:54:21 【问题描述】:我有一个 Facebook 桌面应用程序,并且正在使用 Graph API。 我能够获取访问令牌,但完成之后 - 我不知道如何获取用户 ID。
我的流程是这样的:
我将用户发送到 https://graph.facebook.com/oauth/authorize,并拥有所有必需的扩展权限。
在我的重定向页面中,我从 Facebook 获取代码。
然后我使用我的 API 密钥向 graph.facebook.com/oauth/access_token 执行 HTTP 请求,并在响应中获得访问令牌。
从那时起,我无法获得用户 ID。
如何解决这个问题?
【问题讨论】:
【参考方案1】:如果您想使用 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”)【参考方案2】:
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 之前,它可以正常工作,但在 Facebook 更新到 OAuth2.0 之后。这个方法已经不行了。 我希望我已经注意到有关这种方法的警告。今天我们被抓到了,因为访问令牌的格式似乎已经改变了。我强烈建议避免使用这种方法并采用公认的答案。 这是我见过的最有趣的答案:D 另请注意,这样的方法不会验证给定的用户 ID - 任何人都可以拼接他们想要的任何 ID,并且此代码会盲目信任它。【参考方案3】:最简单的方法是
https://graph.facebook.com/me?fields=id&access_token="xxxxx"
然后你会得到只包含用户 ID 的 json 响应。
【讨论】:
"error": "message": "(#100) Unknown fields: userid.", "type": "OAuthException", "code": 100 @NikolayKuznetsov: 对不起,在忽略而不是 id 我写了 userid,我现在编辑了,请再试一次 没问题,我已经试过了,所以我发表我之前的评论。 我收到以下错误我的访问令牌处于活动状态。 "error": "message": "必须使用活动访问令牌来查询当前用户的信息。", "type": "OAuthException", "code": 2500, "fbtrace_id": "HA0UNBRymfa" 什么是访问令牌以及从哪里获取它【参考方案4】:在 FacebookSDK v2.1 中(我无法检查旧版本)。我们有
NSString *currentUserFBID = [FBSession activeSession].accessTokenData.userID;
但是根据 FacebookSDK 中的评论
@discussion 这可能不会为 ios 系统帐户等登录行为填充。
所以可能你应该检查它是否可用,然后是否使用它,或者调用请求来获取用户ID
【讨论】:
【参考方案5】:使用最新的 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 的某些部分【参考方案6】:您可以在 onSuccess(LoginResult loginResult)
上使用以下代码loginResult.getAccessToken().getUserId();
【讨论】:
【参考方案7】:您只需点击另一个 Graph API:
https://graph.facebook.com/me?access_token=access-token
它还会提供您的电子邮件 ID 和用户 ID(用于 Facebook)。
【讨论】:
我只从中获取 provider_id 和名称,但我没有从 facebook 获取用户名。像link,这是直接打开用户个人资料的用户名,提供者ID不起作用。【参考方案8】:查看此answer,其中描述了如何获取 ID 响应。 首先,您需要创建方法获取数据:
const https = require('https');
getFbData = (accessToken, apiPath, callback) =>
const options =
host: 'graph.facebook.com',
port: 443,
path: `$apiPathaccess_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);
);
【讨论】:
以上是关于如何使用访问令牌获取 Facebook 用户 ID的主要内容,如果未能解决你的问题,请参考以下文章
如何在 C# 中从 Facebook SDK 获取当前用户访问令牌?不是应用访问令牌
如何解决 facebook 在 python 中获取访问令牌错误?
facebook 注册插件 - 获取大型个人资料图片或用户名或用户 ID?