J'ai une application de bureau Facebook et j'utilise le Graph API . Je peux obtenir le jeton d'accès, mais après cela, je ne sais pas comment obtenir l'identifiant de l'utilisateur.
Mon flux est comme ça:
J'envoie l'utilisateur à https://graph.facebook.com/oauth/authorize avec toutes les autorisations étendues requises.
Dans ma page de redirection, je reçois le code de Facebook.
Ensuite, j'exécute une requête HTTP auprès de graph.facebook.com/oauth/access_token avec ma clé d'API et je reçois le jeton d'accès dans la réponse.
À partir de ce moment, je ne peux pas obtenir l'ID utilisateur.
Comment ce problème peut-il être résolu?
Si vous souhaitez utiliser Graph API pour obtenir l'ID utilisateur actuel, envoyez simplement une demande à:
https://graph.facebook.com/me?access_token=...
Le plus simple est
https://graph.facebook.com/me?fields=id&access_token="xxxxx"
alors vous obtiendrez une réponse json qui ne contient que l'ID utilisateur.
Le jeton d'accès à Facebook est également similaire "1249203702 | 2.h1MTNeLqcLqw __. 86400.129394400-605430316 | -WE1iH_CV-afTgyhDPc"
si vous extrayez la partie centrale en utilisant | pour vous séparer
2.h1MTNeLqcLqw __. 86400.129394400-605430316
puis divisé à nouveau par -
la dernière partie 605430316 est l'identifiant de l'utilisateur.
Voici le code C # pour extraire l'ID utilisateur du jeton d'accès:
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;
}
ATTENTION: La structure du jeton d'accès n'est pas documentée et ne correspond pas toujours au modèle ci-dessus. Utilisez à vos risques et périls.
Mise à jour En raison de changements sur Facebook. La méthode préférée pour obtenir l'ID utilisateur à partir du jeton d'accès chiffré est la suivante:
try
{
var fb = new FacebookClient(accessToken);
var result = (IDictionary<string, object>)fb.Get("/me?fields=id");
return (string)result["id"];
}
catch (FacebookOAuthException)
{
return null;
}
Vous pouvez utiliser le code ci-dessous sur onSuccess (LoginResult loginResult)
loginResult.getAccessToken (). getUserId ();
Vous devez juste frapper une autre API graphique:
https://graph.facebook.com/me?access_token={access-token}
Cela vous donnera également votre identifiant de messagerie électronique et votre identifiant d'utilisateur (pour Facebook).
Avec la dernière API, voici le code que j'ai utilisé pour cela
/*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"]);
dans FacebookSDK v2.1 (je ne peux pas vérifier l'ancienne version). On a
NSString *currentUserFBID = [FBSession activeSession].accessTokenData.userID;
Cependant, selon le commentaire dans FacebookSDK
@discussion Cela peut ne pas être renseigné pour les comportements de connexion tels que le compte système iOS.
Alors, vous devriez peut-être vérifier si elle est disponible, puis utiliser ou appeler la demande pour obtenir l'ID utilisateur
Découvrez ceci réponse , qui décrit comment obtenir une réponse ID. Tout d'abord, vous devez créer la méthode 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();
}
Ensuite, utilisez simplement votre méthode quand vous le souhaitez, comme ceci:
getFbData(access_token, '/me?fields=id&', (result) => {
console.log(result);
});