Como obter o ID de usuário do Facebook usando o token de acesso

88

Eu tenho um aplicativo de desktop do Facebook e estou usando a API Graph . Consigo obter o token de acesso, mas depois de feito - não sei como obter o ID do usuário.

Meu fluxo é assim:

  1. Eu envio o usuário para https://graph.facebook.com/oauth/authorize com todas as permissões estendidas necessárias.

  2. Na minha página de redirecionamento, recebo o código do Facebook.

  3. Em seguida, eu executo uma solicitação HTTP para graph.facebook.com/oauth/access_token com minha chave de API e recebo o token de acesso na resposta.

Desse ponto em diante, não consigo obter o ID do usuário.

Como esse problema pode ser resolvido?

Mohoch
fonte

Respostas:

152

Se você deseja usar a API Graph para obter o ID do usuário atual, basta enviar uma solicitação para:

https://graph.facebook.com/me?access_token=...
serg
fonte
1
Tentei a chamada exata acima: apenas retorna: {"sucesso": verdadeiro}
Paul Kenjora
3
Isso não retorna mais id. Uso:https://graph.facebook.com/me?fields=id&access_token=xxxxxx
M3RS
1
O que é 'access_token'? Tentei usar o token de acesso à página e o token de acesso do usuário. Recebo respostas de 'token inválido' usando isso.
Formiga
32

A maneira mais fácil é

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

então você obterá a resposta json que contém apenas o ID do usuário.

pashaplus
fonte
1
{"error": {"message": "(# 100) Campos desconhecidos: userid.", "type": "OAuthException", "code": 100}}
Nikolay Kuznetsov
1
@NikolayKuznetsov: desculpe cara, em negligenciar em vez de id escrevi userid , editei agora, tente novamente
pashaplus
1
Não tem problema, eu já experimentei, então posto meu comentário anterior.
Nikolay Kuznetsov
2
Estou recebendo o seguinte erro: Meu token de acesso está ativo. {"error": {"message": "Um token de acesso ativo deve ser usado para consultar informações sobre o usuário atual.", "type": "OAuthException", "code": 2500, "fbtrace_id": "HA0UNBRymfa"} }
Ajit Goel
10

O token de acesso do Facebook também é semelhante a "1249203702 | 2.h1MTNeLqcLqw __. 86400.129394400-605430316 | -WE1iH_CV-afTgyhDPc"

se você extrair a parte do meio usando | para dividir você consegue

2.h1MTNeLqcLqw __. 86400.129394400-605430316

então dividido novamente por -

a última parte 605430316 é o ID do usuário.

Aqui está o código C # para extrair o ID do usuário do token de acesso:

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

AVISO: a estrutura do token de acesso não é documentada e nem sempre se ajusta ao padrão acima. Use-o por sua própria conta e risco.

Atualização devido a mudanças no Facebook. o método preferido para obter o ID do usuário do token de acesso criptografado é o seguinte:

try
{
    var fb = new FacebookClient(accessToken);
    var result = (IDictionary<string, object>)fb.Get("/me?fields=id");
    return (string)result["id"];
}
catch (FacebookOAuthException)
{
    return null;
}
prabir
fonte
5
Funciona perfeitamente antes, mas depois da atualização do Facebook para o OAuth2.0. Este método não funciona mais.
lucemia de
11
Eu gostaria de ter ouvido o aviso sobre essa abordagem. Fomos pegos com nossas calças abaixadas hoje, pois do nada o formato dos tokens de acesso parece ter mudado. Recomendo enfaticamente evitar essa abordagem e seguir a resposta aceita.
Todd Menier,
1
essa é a resposta mais engraçada que já vi: D
khunshan,
Observe também que métodos como este não verificam o ID de usuário fornecido - qualquer um poderia unir qualquer ID que desejasse e esse código confiaria cegamente nele.
Matt Lyons de
7

Você pode usar o código abaixo em onSuccess (LoginResult loginResult)

loginResult.getAccessToken (). getUserId ();

SkyWalker
fonte
6

Você só precisa acessar outra API Graph:

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

Ele também fornecerá seu ID de e-mail e ID de usuário (para Facebook).


fonte
Estou recebendo apenas o provider_id e o nome disso, mas não estou recebendo o nome de usuário do Facebook. Como o link , este é o nome de usuário que abrirá diretamente o perfil dos usuários, com o id do provedor não está funcionando.
Salman Riyaz
3

Com a API mais recente, aqui está o código que usei para ela

/*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"]);
AndrewSmiley
fonte
Tive a ideia, mas não retorna userID apenas o token.
János
Lembre-se de que esta resposta tem 2 anos. Eles podem ter alterado algumas partes do SDK
AndrewSmiley
2

no FacebookSDK v2.1 (não consigo verificar a versão anterior). Nós temos

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

No entanto, de acordo com o comentário no FacebookSDK

@discussion Não pode ser preenchido para comportamentos de login, como a conta do sistema iOS.

Talvez você deva verificar se está disponível e, em seguida, se usá-lo ou chamar a solicitação para obter o ID do usuário

Gia Dang
fonte
0

Confira esta resposta , que descreve como obter uma resposta de ID. Primeiro, você precisa criar o método get data:

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

Em seguida, basta usar seu método sempre que quiser, como este:

getFbData(access_token, '/me?fields=id&', (result) => {
      console.log(result);
});
Chavy
fonte