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

Moh*_*och 85 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请求,然后在响应中获取访问令牌.

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

怎样才能解决这个问题?

ser*_*erg 150

如果您想使用Graph API获取当前用户ID,那么只需向以下位置发送请求:

https://graph.facebook.com/me?access_token=...
Run Code Online (Sandbox Code Playgroud)

  • 这不再返回 id。使用:`https://graph.facebook.com/me?fields=id&access_token=xxxxxx` (5认同)
  • 什么是“access_token”?我尝试使用页面访问令牌和用户访问令牌。我使用此方法得到“无效令牌”响应。 (2认同)

pas*_*lus 29

最简单的方法是

https://graph.facebook.com/me?fields=id&access_token="xxxxx"
Run Code Online (Sandbox Code Playgroud)

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

  • { "error": { "message": "(#100) Unknown fields: userid.", "type": "OAuthException", "code": 100 } } (2认同)
  • 我收到以下错误我的访问令牌处于活动状态。{ "error": { "message": "必须使用活动访问令牌来查询当前用户的信息。", "type": "OAuthException", "code": 2500, "fbtrace_id": "HA0UNBRymfa" } } (2认同)

pra*_*bir 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;
    }
Run Code Online (Sandbox Code Playgroud)

警告: 访问令牌的结构未记录,可能并不总是符合上述模式.需要您自担风险使用它.

更新 由于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;
}
Run Code Online (Sandbox Code Playgroud)

  • 我希望我听过关于这种做法的警告.今天我们的裤子被抓住了,因为访问令牌的格式似乎已经发生了变化.我强烈建议避免使用这种方法,并采用已接受的答案. (11认同)
  • 它之前完美运行,但在Facebook更新到OAuth2.0之后.这种方法不再适用. (5认同)
  • 这是我见过的最有趣的答案 :D (2认同)

Sky*_*ker 7

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

.loginResult.getAccessToken()getUserId();


小智 6

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

https://graph.facebook.com/me?access_token={access-token}
Run Code Online (Sandbox Code Playgroud)

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