アクセストークンを使用してFacebookユーザーIDを取得する方法


88

Facebookデスクトップアプリケーションがあり、Graph APIを使用しています。アクセストークンを取得できますが、その後、ユーザーのIDを取得する方法がわかりません。

私の流れは次のとおりです:

  1. 必要な拡張権限をすべて付与してユーザーをhttps://graph.facebook.com/oauth/authorizeに送信します。

  2. 私のリダイレクトページでは、Facebookからコードを取得しています。

  3. 次に、APIキーを使用してgraph.facebook.com/oauth/access_tokenへのHTTPリクエストを実行し、応答でアクセストークンを取得します。

それ以降、ユーザーIDを取得できません。

この問題はどのように解決できますか?

回答:


152

Graph APIを使用して現在のユーザーIDを取得する場合は、次の場所にリクエストを送信します。

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

1
私は上記の正確な呼び出しを試してみました:ただ次を返します:{"success":true}
Paul Kenjora

3
これはもはやidを返しません。使用:https://graph.facebook.com/me?fields=id&access_token=xxxxxx
M3RS

1
「access_token」とは何ですか?ページアクセストークンとユーザーアクセストークンを使ってみました。これを使用して「無効なトークン」の応答を受け取ります。
Ant

32

最も簡単な方法は

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

次に、useridのみを含むjson応答を取得します。


1
{"error":{"message": "(#100)Unknown fields:userid。"、 "type": "OAuthException"、 "code":100}}
Nikolay Kuznetsov

1
@NikolayKuznetsov:申し訳ありませんが、IDの代わりに見落としているので、私はuseridを書きました。今編集しました。もう一度試してください
pashaplus

1
問題ありません。すでに試したので、以前のコメントを投稿します。
Nikolay Kuznetsov、

2
次のエラーが表示される私のアクセストークンはアクティブです。{"error":{"message": "現在のユーザーに関する情報を照会するには、アクティブなアクセストークンを使用する必要があります。"、 "type": "OAuthException"、 "code":2500、 "fbtrace_id": "HA0UNBRymfa"} }
Ajit Goel 2018

10

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

5
以前は完全に機能していましたが、FacebookがOAuth2.0にアップデートした後です。このメソッドは機能しなくなりました。
lucemia

11
私はこのアプローチについての警告に気をつけていればよかったのに。突然、アクセストークンの形式が変わったように見えたので、今日はパンツに引っかかりました。私はこのアプローチを避け、受け入れられた答えを使用することを強くお勧めします。
Todd Menier、2011年

1
それは私が今まで見た中で最も面白い答えです:D
クンシャン

また、このようなメソッドは指定されたユーザーIDを検証しないことに注意してください-誰でも自分の好きなIDをスプライスでき、このコードは盲目的にそれを信頼します。
Matt Lyons、

7

onSuccess(LoginResult loginResult)で以下のコードを使用できます

loginResult.getAccessToken()。getUserId();


6

別のグラフAPIを実行する必要があります。

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

メールIDとユーザーID(Facebookの場合)も提供されます。


それからプロバイダーIDと名前のみを取得していますが、フェイスブックからユーザー名を取得していません。linkと同様に、これはユーザープロファイルを直接開くユーザー名です。プロバイダーIDを使用すると機能しません。
Salman Riyaz

3

最新の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の一部を変更した可能性があります
AndrewSmiley 2017年

2

FacebookSDK v2.1(古いバージョンを確認できません)。我々は持っています

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

しかしFacebookSDKのコメントによると

@discussionこれは、iOSシステムアカウントなどのログイン動作では入力されない場合があります。

それで、それが利用可能かどうかを確認し、それを使用するか、またはリクエストを呼び出してユーザーIDを取得する必要があるかもしれません


0

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);
});
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.