วิธีรับ ID ผู้ใช้ Facebook โดยใช้โทเค็นการเข้าถึง


89

ฉันมีโปรแกรมเดสก์ทอป Facebook และกำลังใช้API กราฟ ฉันสามารถรับโทเค็นการเข้าถึงได้ แต่หลังจากนั้นเสร็จ - ฉันไม่รู้วิธีรับ ID ผู้ใช้

การไหลของฉันเป็นแบบนี้:

  1. ฉันส่งผู้ใช้ไปที่https://graph.facebook.com/oauth/authorizeด้วยสิทธิ์เพิ่มเติมที่จำเป็นทั้งหมด

  2. ในหน้าเปลี่ยนเส้นทางของฉันฉันได้รับรหัสจาก Facebook

  3. จากนั้นฉันดำเนินการร้องขอ HTTP ไปยังgraph.facebook.com/oauth/access_tokenด้วยคีย์ API ของฉันและฉันได้รับโทเค็นการเข้าถึงในการตอบกลับ

จากนั้นฉันไม่สามารถรับ ID ผู้ใช้

ปัญหานี้จะแก้ไขได้อย่างไร?

คำตอบ:


153

หากคุณต้องการใช้ Graph API เพื่อรับ ID ผู้ใช้ปัจจุบันให้ส่งคำขอไปที่:

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

1
ฉันลองโทรตามข้างต้น: กลับ: {"success": true}
Paul Kenjora

4
สิ่งนี้ไม่ส่งคืน id อีกต่อไป ใช้:https://graph.facebook.com/me?fields=id&access_token=xxxxxx
M3RS

2
'access_token' คืออะไร? ฉันลองใช้โทเค็นการเข้าถึงเพจและโทเค็นการเข้าถึงของผู้ใช้ ฉันได้รับคำตอบว่า 'โทเค็นไม่ถูกต้อง' โดยใช้สิ่งนี้
มด

34

วิธีที่ง่ายที่สุดคือ

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

จากนั้นคุณจะได้รับการตอบสนอง json ซึ่งมีเฉพาะ userid


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

โทเค็นการเข้าถึงคืออะไรและหาได้จากที่ไหน
Prime

10

โทเค็น acess ของ facebook ก็ดูคล้ายกันเช่นกัน "1249203702 | 2.h1MTNeLqcLqw __. 86400.129394400-605430316 | -WE1iH_CV-afTgyhDPc"

หากคุณแยกส่วนตรงกลางโดยใช้ | เพื่อแยกคุณได้

2.h1MTNeLqcLqw __. 86400.129394400-605430316

แล้วแยกอีกครั้งโดย -

ส่วนสุดท้าย 605430316 คือรหัสผู้ใช้

นี่คือรหัส C # เพื่อแยก ID ผู้ใช้จากโทเค็นการเข้าถึง:

   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 วิธีที่ต้องการในการรับรหัสผู้ใช้จากโทเค็นการเข้าถึงที่เข้ารหัสมีดังนี้:

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

12
ฉันหวังว่าฉันจะฟังคำเตือนเกี่ยวกับแนวทางนี้ วันนี้เราจับกางเกงของเราลงได้เนื่องจากสีฟ้ารูปแบบของโทเค็นการเข้าถึงดูเหมือนจะเปลี่ยนไป ฉันขอแนะนำอย่างยิ่งให้หลีกเลี่ยงแนวทางนี้และใช้คำตอบที่ได้รับการยอมรับ
Todd Menier

2
นั่นเป็นคำตอบที่ตลกที่สุดที่ฉันเคยเห็น: D
khunshan

นอกจากนี้โปรดทราบว่าวิธีการเช่นนี้ไม่ได้ตรวจสอบ ID ผู้ใช้ที่ระบุ - ใคร ๆ ก็สามารถแยก ID อะไรก็ได้ที่ต้องการและรหัสนี้จะเชื่อถือมันโดยสุ่มสี่สุ่มห้า
Matt Lyons

7

คุณสามารถใช้โค้ดด้านล่างบนonSuccess (LoginResult loginResult)

loginResult.getAccessToken (). getUserId ();


6

คุณต้องกด Graph API อื่น:

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

มันจะให้รหัสอีเมลและรหัสผู้ใช้ของคุณ (สำหรับ Facebook) ด้วย


ฉันได้รับเพียง provider_id และชื่อจากสิ่งนั้น แต่ฉันไม่ได้รับชื่อผู้ใช้จาก facebook เช่นเดียวกับลิงก์นี่คือชื่อผู้ใช้ที่จะเปิดโปรไฟล์ผู้ใช้โดยตรงโดยที่ 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"]);

ฉันมีความคิด แต่มันไม่ส่งคืน userID เฉพาะโทเค็น
János

โปรดทราบว่าคำตอบนี้มีอายุ 2 ปี พวกเขาอาจเปลี่ยนบางส่วนของ SDK
AndrewSmiley

2

ใน FacebookSDK v2.1 (ฉันไม่สามารถตรวจสอบเวอร์ชันเก่ากว่าได้) เรามี

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

อย่างไรก็ตามตามความคิดเห็นใน FacebookSDK

@discussion สิ่งนี้อาจไม่ถูกเติมสำหรับพฤติกรรมการเข้าสู่ระบบเช่นบัญชีระบบ iOS

ดังนั้นคุณควรตรวจสอบว่าพร้อมใช้งานหรือไม่จากนั้นใช้งานหรือโทรไปที่คำขอเพื่อรับรหัสผู้ใช้


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.