Làm thế nào để xác minh mã thông báo truy cập Facebook?


108

Chỉ có một điều mà máy chủ phải làm; chỉ cần kiểm tra tính hợp lệ của bất kỳ mã thông báo truy cập nào.

Khách hàng gửi đến id người dùng máy chủ và mã thông báo truy cập thu được bởi FB.getLoginStatus. Như tôi mong đợi, sẽ có bất kỳ URL nào kiểm tra tính hợp lệ của mã thông báo truy cập, chẳng hạn như http://xxx.facebook.com/access_token?=xxxxxxxxxxxxxxxxxxxxxxxxxxxx.

Điều đó trả về liệu nó có sẵn một hay không hoặc có API nào (phía máy chủ) cho điều đó không?


2
Tại sao không chỉ gọi graph.facebook.com/me/permissions?
Igy



Câu trả lời:


136

Phương pháp được hỗ trợ chính thức cho việc này là:

GET graph.facebook.com/debug_token?
     input_token={token-to-inspect}
     &access_token={app-token-or-admin-token}

Xem tài liệu mã thông báo kiểm tra để biết thêm thông tin.

Một phản hồi ví dụ là:

{
    "data": {
        "app_id": 138483919580948, 
        "application": "Social Cafe", 
        "expires_at": 1352419328, 
        "is_valid": true, 
        "issued_at": 1347235328, 
        "metadata": {
            "sso": "iphone-safari"
        }, 
        "scopes": [
            "email", 
            "publish_actions"
        ], 
        "user_id": 1207059
    }
}

24
Tôi nghĩ rằng thật sai lầm khi nói rằng facebook có nhiều khả năng đưa ra những thay đổi đột phá hơn. Họ không nêu bất cứ nơi nào và tài liệu chính thức của họ làm cho nó rõ ràng rằng đây là cách để xác nhận access token
Ed Sykes

1
@rynop, tốt, tên của điểm cuối API là "debug_token" và nó được mô tả trong một phần của tài liệu API Facebook có nhãn Nhận thông tin về mã thông báo và gỡ lỗi . Phần này của tài liệu được tham chiếu bởi HTML anchor #debug và nói rằng API là phần cuối cho công cụ gỡ lỗi của chúng. Có vẻ khá rõ ràng với tôi, nhưng bạn là đúng rằng về mặt kỹ thuật, hư không là nó rõ ràng và trực tiếp tuyên bố rằng các chức năng không có ý định để sử dụng sản xuất ... :-)
Jonathan Gilbert

5
Vấn đề chính ở đây là việc sử dụng phương thức me? Access_token hoàn toàn sai nếu dữ liệu đến từ phía máy khách; vì bất kỳ trang web nào cũng có thể tìm kiếm các mã thông báo sau đó sử dụng chúng để xác thực vào trang web của bạn bằng cách truy cập api của bạn.
srcspider

4
OP muốn kiểm tra ID người dùng được liên kết với mã thông báo. Các / me endpoint trả về ID người dùng, nhưng chỉ khi các thẻ truy cập có giá trị (bởi vì, sau khi tất cả, các dấu hiệu được sử dụng để xác định đó "tôi" để trở về). Vì vậy, hãy lấy / tôi và so sánh các ID người dùng. Cần lưu ý rằng mỗi ứng dụng đều có ID người dùng có phạm vi đặc biệt riêng, vì vậy bạn không thể so sánh ID từ một nguồn khác với / tôi bạn nhận được bằng mã thông báo của ứng dụng của riêng bạn.
Jonathan Gilbert

3
Các tài liệu trước đây có thể đã tham khảo bằng cách sử dụng tài liệu này để gỡ lỗi. Nhưng hiện tại nó gợi ý rằng đây chính xác là trường hợp sử dụng.
AndHeiberg

78

Bạn chỉ cần yêu cầu https://graph.facebook.com/me?access_token=xxxxxxxxxxxxxxxxx nếu gặp lỗi, mã thông báo không hợp lệ. Nếu bạn nhận được một đối tượng JSON có thuộc tính id thì nó hợp lệ.

Rất tiếc, điều này sẽ chỉ cho bạn biết liệu mã thông báo của bạn có hợp lệ hay không, chứ không phải nếu nó đến từ ứng dụng của bạn.


9
Xin lỗi, câu hỏi của tôi không rõ ràng. Vấn đề là làm thế nào để xác minh người dùng chỉ với uid và accessToken. graph.facebook.com/100000726976284?access_token=xxxxxx Ví dụ: có cách nào đơn giản để kiểm tra xem mã thông báo truy cập của người dùng 100000726976284 có phải là xxxxxx không. Tôi đoán rằng hồ sơ 'đã được xác minh' là chìa khóa. Chỉ khi tôi đặt đúng xxxxxx, tôi mới có thể thấy đã xác minh = true trong phản hồi.
So Jae Kyung

14
Yêu cầu graph.facebook.com/me?access_token=xxxxxxxxxxxxxxxxx như đã đề cập ở trên, sau đó kiểm tra xem uid bạn có khớp với id được trả lại từ yêu cầu hay không.
AlexQueue

51
Thao tác này sẽ không kiểm tra xem access_token có dành cho ứng dụng của bạn hay không.
Ed Sykes

Cũng không cung cấp expires_atthông tin.
vinesh

4
phản đối, đồng ý với @EdSykes, bằng cách này, bạn không thể kiểm tra xem mã thông báo truy cập có thuộc về các nhà phát triển
không.facebook.com/docs/facebook

35

Tôi chỉ muốn cho bạn biết rằng cho đến hôm nay, lần đầu tiên tôi nhận được mã thông báo truy cập ứng dụng (thông qua yêu cầu GET cho Facebook), và sau đó sử dụng mã thông báo nhận được như app-token-or-admin-tokentrong:

GET graph.facebook.com/debug_token?
    input_token={token-to-inspect}
    &access_token={app-token-or-admin-token}

Tuy nhiên, tôi vừa nhận ra một cách tốt hơn để làm điều này (với lợi ích bổ sung là yêu cầu một yêu cầu GET ít hơn):

GET graph.facebook.com/debug_token?
    input_token={token-to-inspect}
    &access_token={app_id}|{app_secret}

Như được mô tả trong tài liệu của Facebook về Mã thông báo truy cập tại đây .


6
Cảm ơn bạn. Lưu ý cho những người khác: chữ "|" nhân vật phải được bao gồm (mà không chỉ ra 'hoặc') như hiển thị trên trang được liên kết đến trong câu trả lời: developers.facebook.com/docs/facebook-login/...
Mike S

1
Điều này không phải là không chắc chắn? Việc gửi bí mật của ứng dụng thông qua các tham số truy vấn URL sẽ tiết lộ nó cho bất kỳ ai "ở giữa" giữa máy chủ của bạn và Facebook và HTTPS sẽ không giúp ích được gì, vì URL không được mã hóa. Bất kỳ ai cũng có thể "lắng nghe" (đánh hơi) các yêu cầu có URL ở định dạng debug_token và đánh cắp bí mật ứng dụng Facebook.
Simeon


@Xin cảm ơn, tôi thấy tôi đã bị ấn tượng sai :) Có vẻ như chỉ phần máy chủ của URL không được mã hóa.
Simeon

1
Thêm dấu '|' với bí mật ứng dụng cuối cùng đã khiến tôi đi. Nếu không thì API này không hoạt động.
Uday

4

Chỉ cần yêu cầu (HTTP GET):

https://graph.facebook.com/USER_ID/access_token=xxxxxxxxxxxxxxxxx

Đó là nó.



1

Trao đổi Access Tokencho Mobile Number and Country Code(Phía máy chủ HOẶC Phía máy khách)

Bạn có thể lấy mobile numberbằng của mình access_tokenvới API https://graph.accountkit.com/v1.1/me/?access_token=xxxxxxxxxxxx . Có thể, khi bạn có mobile numberid, bạn có thể làm việc với nó để xác minh người dùng với của bạn server & database.

xxxxxxxxxx ở trên là Access Token

Phản hồi ví dụ:

{
   "id": "61940819992708",
   "phone": {
      "number": "+91XX82923912",
      "country_prefix": "91",
      "national_number": "XX82923912"
   }
}


Trao đổi Auth Codecho Access Token(Phía máy chủ)

Nếu Auth Codethay vào đó, bạn có thể lấy phần mềm Access Tokennày API- https://graph.accountkit.com/v1.1/access_token?grant_type=authorization_code&code=xxxxxxxxxx&access_token=AA|yyyyyyyyyy|zzzzzzzzzz

xxxxxxxxxx, yyyyyyyyyyzzzzzzzzzzở trên là Auth Code, App IDApp Secrettương ứng.

Phản hồi mẫu

{
   "id": "619XX819992708",
   "access_token": "EMAWdcsi711meGS2qQpNk4XBTwUBIDtqYAKoZBbBZAEZCZAXyWVbqvKUyKgDZBniZBFwKVyoVGHXnquCcikBqc9ROF2qAxLRrqBYAvXknwND3dhHU0iLZCRwBNHNlyQZD",
   "token_refresh_interval_sec": XX92000
}

Lưu ý - Điều này được ưu tiên hơn server-sideAPIyêu cầu APP Secretkhông có nghĩa là sharedcho security reasons.

Chúc may mắn.

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.