Cách lấy id người dùng Facebook bằng mã truy cập


88

Tôi có một ứng dụng Facebook trên máy tính để bàn và đang sử dụng API Đồ thị . Tôi có thể lấy mã thông báo truy cập, nhưng sau khi hoàn tất - tôi không biết cách lấy ID của người dùng.

Luồng của tôi là như thế này:

  1. Tôi đưa người dùng đến https://graph.facebook.com/oauth/authorize với tất cả các quyền mở rộng bắt buộc.

  2. Trong trang chuyển hướng của mình, tôi lấy mã từ Facebook.

  3. Sau đó, tôi thực hiện một yêu cầu HTTP tới graph.facebook.com/oauth/access_token bằng khóa API của mình và tôi nhận được mã thông báo truy cập trong phản hồi.

Từ thời điểm đó, tôi không thể lấy được ID người dùng.

Làm thế nào để giải quyết vấn đề này?

Câu trả lời:


152

Nếu bạn muốn sử dụng API Đồ thị để lấy ID người dùng hiện tại thì chỉ cần gửi yêu cầu tới:

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

1
Tôi đã thử gọi chính xác ở trên: just return: {"success": true}
Paul Kenjora

3
Điều này không trả về id nữa. Sử dụng:https://graph.facebook.com/me?fields=id&access_token=xxxxxx
M3RS

1
'Access_token' là gì? Tôi đã thử sử dụng mã thông báo truy cập trang và mã thông báo truy cập người dùng. Tôi nhận được phản hồi 'mã thông báo không hợp lệ' bằng cách sử dụng này.
Ant

32

Cách dễ nhất là

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

thì bạn sẽ nhận được phản hồi json chỉ chứa userid.


1
{"error": {"message": "(# 100) Trường không xác định: userid.", "type": "OAuthException", "code": 100}}
Nikolay Kuznetsov

1
@NikolayKuznetsov: xin lỗi người đàn ông, trong Overlook thay vì id i viết userid , tôi thay đổi nội dung bây giờ, hãy thử lại
pashaplus

1
Không sao, tôi đã thử nó rồi, vì vậy tôi đăng nhận xét trước của tôi.
Nikolay Kuznetsov

2
Tôi gặp lỗi sau Mã thông báo truy cập của tôi đang hoạt động. {"error": {"message": "Mã truy cập đang hoạt động phải được sử dụng để truy vấn thông tin về người dùng hiện tại.", "type": "OAuthException", "code": 2500, "fbtrace_id": "HA0UNBRymfa"} }
Ajit Goel

10

Mã thông báo facebook acess trông cũng tương tự "1249203702 | 2.h1MTNeLqcLqw __. 86400.129394400-605430316 | -WE1iH_CV-afTgyhDPc"

nếu bạn trích xuất phần giữa bằng cách sử dụng | chia tách bạn nhận được

2.h1MTNeLqcLqw __. 86400.129394400-605430316

sau đó chia lại bằng -

phần cuối cùng 605430316 là id người dùng.

Đây là mã C # để trích xuất id người dùng từ mã thông báo truy cập:

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

CẢNH BÁO: Cấu trúc của mã thông báo truy cập không có tài liệu và có thể không phải lúc nào cũng phù hợp với mẫu trên. Sử dụng nó có nguy cơ của riêng bạn.

Cập nhật Do những thay đổi trong Facebook. phương pháp ưa thích để lấy userid từ mã thông báo truy cập được mã hóa như sau:

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
Nó hoạt động hoàn hảo trước đây, nhưng sau khi Facebook cập nhật lên OAuth2.0. Phương pháp này không thể hoạt động nữa.
lucemia

11
Tôi ước tôi đã chú ý đến cảnh báo về cách tiếp cận này. Hôm nay chúng tôi bị tụt quần vì định dạng của mã thông báo truy cập dường như đã thay đổi. Tôi thực sự khuyên bạn nên tránh cách tiếp cận này và đi với câu trả lời được chấp nhận.
Todd Menier

1
thats câu trả lời hài hước nhất tôi từng thấy: D
khunshan

Cũng lưu ý rằng các phương pháp như thế này không xác minh ID người dùng đã cho - bất kỳ ai cũng có thể ghép vào bất kỳ id nào họ muốn và mã này sẽ tin tưởng một cách mù quáng.
Matt Lyons

7

Bạn có thể sử dụng mã bên dưới trên onSuccess (LoginResult đăng nhậpResult)

loginResult.getAccessToken (). getUserId ();


6

Bạn chỉ cần nhấn một API Đồ thị khác:

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

Nó cũng sẽ cung cấp Id e-mail của bạn và Id người dùng (đối với Facebook).


Tôi chỉ nhận được cung cấp_id và tên từ đó, Nhưng tôi không nhận được tên người dùng từ facebook. Giống như liên kết , Đây là tên người dùng sẽ trực tiếp mở hồ sơ người dùng, với id nhà cung cấp, nó không hoạt động.
Salman Riyaz

3

Với API mới nhất, đây là mã tôi đã sử dụng cho nó

/*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"]);

Tôi có ý tưởng, nhưng nó không chỉ trả về mã thông báo userID.
János

Hãy ghi nhớ câu trả lời này là 2 tuổi. Họ có thể đã thay đổi một số bộ phận của SDK
AndrewSmiley

2

trong FacebookSDK v2.1 (Tôi không thể kiểm tra phiên bản cũ hơn). Chúng ta có

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

Tuy nhiên theo bình luận trong FacebookSDK

@discussion Điều này có thể không được điền cho các hành vi đăng nhập chẳng hạn như tài khoản hệ thống iOS.

Vì vậy, có thể bạn nên kiểm tra xem nó có sẵn hay không, sau đó sử dụng nó hay gọi yêu cầu để lấy id người dùng


0

Kiểm tra câu trả lời này , mô tả, cách nhận phản hồi ID. Đầu tiên, bạn cần tạo phương thức lấy dữ liệu:

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

Sau đó, chỉ cần sử dụng phương pháp của bạn bất cứ khi nào bạn muốn, như sau:

getFbData(access_token, '/me?fields=id&', (result) => {
      console.log(result);
});
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.