จะตรวจสอบโทเค็นการเข้าถึง Facebook ได้อย่างไร?


108

มีเพียงสิ่งเดียวที่เซิร์ฟเวอร์ต้องทำ เพียงตรวจสอบความถูกต้องของโทเค็นการเข้าถึงใด ๆ

FB.getLoginStatusลูกค้าส่งไปยังรหัสผู้ใช้และการเข้าถึงเซิร์ฟเวอร์โทเค็นที่ได้รับจาก ขณะที่ผมคาดว่าจะมี URL ใด ๆ http://xxx.facebook.com/access_token?=xxxxxxxxxxxxxxxxxxxxxxxxxxxxที่ตรวจสอบการเข้าถึงความถูกต้องของโทเค็นเช่น

ที่ส่งคืนว่าใช้ได้หรือไม่หรือมี API (ฝั่งเซิร์ฟเวอร์) สำหรับสิ่งนั้นหรือไม่


2
ทำไมไม่โทรไปที่ graph.facebook.com/me/permissions
Igy



คำตอบ:


136

วิธีที่รองรับอย่างเป็นทางการสำหรับสิ่งนี้คือ:

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

ดูเอกสารตรวจสอบโทเค็นสำหรับข้อมูลเพิ่มเติม

ตัวอย่างคำตอบคือ:

{
    "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
ฉันคิดว่ามันทำให้เข้าใจผิดที่จะบอกว่า facebook มีแนวโน้มที่จะนำเสนอการเปลี่ยนแปลงที่ไม่ชัดเจน พวกเขาไม่ได้ระบุว่าทุกที่และเอกสารอย่างเป็นทางการของพวกเขาทำให้ชัดเจนว่านี่เป็นวิธีตรวจสอบโทเค็นการเข้าถึง
Ed Sykes

1
@rynop ดีชื่อของปลายทาง API เป็น "debug_token" และจะมีการอธิบายไว้ในส่วนของเอกสาร API Facebook ระบุว่าการขอข้อมูลเกี่ยวกับสัญญาณและการแก้จุดบกพร่อง เอกสารส่วนนี้อ้างถึงโดย HTML anchor #debug และระบุว่า API เป็นส่วนหลังสำหรับเครื่องมือดีบัก ดูเหมือนจะค่อนข้างชัดเจนสำหรับฉัน แต่คุณพูดถูกว่าในทางเทคนิคไม่มีที่ไหนที่ระบุไว้อย่างชัดเจนและโดยตรงว่าฟังก์ชันนี้ไม่ได้มีไว้สำหรับใช้ในการผลิต ... :-)
Jonathan Gilbert

5
ปัญหาหลักที่นี่คือการใช้เมธอด me? access_token นั้นผิดธรรมดาหากข้อมูลมาจากฝั่งไคลเอ็นต์ เนื่องจากไซต์ใด ๆ สามารถตกปลาเพื่อใช้โทเค็นได้จึงใช้เพื่อตรวจสอบสิทธิ์ในไซต์ของคุณโดยการเข้าถึง API ของคุณ
srcspider

4
OP ต้องการตรวจสอบ ID ผู้ใช้ที่เชื่อมโยงกับโทเค็น กระบวนการ / ฉันปลายทางส่งกลับ ID ผู้ใช้ แต่ถ้าโทเค็นการเข้าถึงที่ถูกต้อง (เพราะหลังจากทั้งหมดโทเค็นที่ใช้ในการตรวจสอบซึ่ง "ฉัน" จะกลับมา) ดังนั้นคว้า / ฉันและเปรียบเทียบ ID ผู้ใช้ โปรดจำไว้ว่าแต่ละแอปจะได้รับรหัสผู้ใช้ที่กำหนดขอบเขตพิเศษของตัวเองดังนั้นคุณจึงไม่สามารถเปรียบเทียบ ID จากแหล่งที่มาอื่นกับ / me ที่คุณได้รับจากโทเค็นของแอปของคุณเอง
Jonathan Gilbert

3
ในอดีตเอกสารอาจมีการอ้างอิงโดยใช้สิ่งนี้สำหรับการดีบัก แต่ปัจจุบันขอแนะนำว่าเป็นกรณีการใช้งาน
AndHeiberg

78

คุณสามารถขอhttps://graph.facebook.com/me?access_token=xxxxxxxxxxxxxxxxxหากคุณได้รับข้อผิดพลาดโทเค็นไม่ถูกต้อง หากคุณได้รับออบเจ็กต์ JSON ที่มีคุณสมบัติ id แสดงว่าถูกต้อง

น่าเสียดายที่สิ่งนี้จะบอกคุณได้ก็ต่อเมื่อโทเค็นของคุณถูกต้องไม่ใช่ว่ามาจากแอปของคุณ


9
ขออภัยคำถามของฉันไม่ชัดเจน ปัญหาคือวิธีตรวจสอบผู้ใช้ด้วย uid และ accessToken เท่านั้น graph.facebook.com/100000726976284?access_token=xxxxxxตัวอย่างเช่นมีวิธีง่ายๆในการตรวจสอบว่าโทเค็นการเข้าถึงของผู้ใช้ 100000726976284 เป็น xxxxxx หรือไม่ ฉันเดาว่าไฟล์ที่ "ยืนยันแล้ว" คือกุญแจสำคัญ เมื่อฉันใส่ xxxxxx ที่ถูกต้องเท่านั้นฉันจะเห็น Verified = true ในการตอบกลับ
So Jae Kyung

14
ขอ graph.facebook.com/me?access_token=xxxxxxxxxxxxxxxxxตามที่กล่าวไว้ข้างต้นจากนั้นตรวจสอบว่า uid ที่คุณมีนั้นตรงกับ id ที่ส่งกลับมาจากคำขอ
AlexQueue

51
การดำเนินการนี้จะไม่ตรวจสอบว่า access_token มีไว้สำหรับแอปของคุณ
Ed Sykes

ยังไม่ให้expires_atข้อมูล
เถาวัลย์

4
downvoting เห็นด้วยกับ @EdSykes วิธีนี้คุณไม่สามารถตรวจสอบหากมีการเข้าถึงโทเค็นเป็นแอปของคุณdevelopers.facebook.com/docs/facebook-login/security
Nikis

36

แค่อยากจะแจ้งให้คุณทราบว่าจนถึงวันนี้ฉันได้รับโทเค็นการเข้าถึงแอพเป็นครั้งแรก (ผ่านการร้องขอ GET ไปที่ Facebook) จากนั้นใช้โทเค็นที่ได้รับapp-token-or-admin-tokenใน:

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

อย่างไรก็ตามฉันเพิ่งตระหนักถึงวิธีที่ดีกว่าในการดำเนินการนี้ (พร้อมประโยชน์เพิ่มเติมจากการขอ GET น้อยกว่าหนึ่งคำขอ):

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

ตามที่อธิบายไว้ในเอกสารของ Facebook สำหรับการเข้าถึงโทเคนนี่


6
ขอบคุณ. หมายเหตุสำหรับผู้อื่น: ตัวอักษร "|" ต้องมีอักขระ (ที่ไม่ได้ระบุว่า 'หรือ') ตามที่แสดงในเพจที่เชื่อมโยงในคำตอบ: developers.facebook.com/docs/facebook-login/…
Mike S

1
นี่ไม่ปลอดภัยเหรอ? การส่งข้อมูลลับของแอปผ่านพารามิเตอร์การสืบค้น URL จะทำให้ทุกคน "อยู่ตรงกลาง" ระหว่างเซิร์ฟเวอร์ของคุณกับ Facebook และ HTTPS จะไม่ช่วยได้เนื่องจาก URL ไม่ได้เข้ารหัส ใคร ๆ ก็สามารถ "ฟัง" (sniff) คำขอที่มี URL ในรูปแบบ debug_token และขโมยข้อมูลลับของแอป Facebook
ไซเมียน

1
@Simeon stackoverflow.com/questions/499591/are-https-urls-encrypted มันค่อนข้างปลอดภัย
Xeing

@ ขอบคุณฉันเห็นว่าฉันแสดงผลผิดพลาด :) ดูเหมือนว่าส่วนโฮสต์ของ URL จะไม่เข้ารหัส
Simeon

1
การเพิ่ม '|' ด้วยความลับของแอพทำให้ฉันไปได้ในที่สุด มิฉะนั้น API นี้จะไม่ทำงาน
Uday



1

แลกเปลี่ยนAccess TokenสำหรับMobile Number and Country Code(ฝั่งเซิร์ฟเวอร์หรือฝั่งไคลเอ็นต์)

คุณจะได้รับmobile numberด้วยaccess_tokenกับเรื่องนี้https://graph.accountkit.com/v1.1/me/?access_token=xxxxxxxxxxxxAPI บางทีเมื่อคุณมีmobile numberและidคุณสามารถดำเนินการกับมันเพื่อยืนยันผู้ใช้ด้วยserver & databaseไฟล์.

xxxxxxxxxx ด้านบนคือไฟล์ Access Token

ตัวอย่างการตอบสนอง:

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


แลกเปลี่ยนAuth CodeสำหรับAccess Token(ฝั่งเซิร์ฟเวอร์)

หากคุณมีAuth Codeแทนคุณสามารถรับสิ่งAccess Tokenนี้ได้ก่อนAPI- https://graph.accountkit.com/v1.1/access_token?grant_type=authorization_code&code=xxxxxxxxxx&access_token=AA|yyyyyyyyyyy|zzzzzzzzzz

xxxxxxxxxx, yyyyyyyyyyและzzzzzzzzzzข้างต้นเป็นAuth Code, App IDและApp Secretตามลำดับ

ตัวอย่างการตอบสนอง

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

หมายเหตุ - นี้เป็นที่ต้องการในserver-sideตั้งแต่APIต้องAPP Secretซึ่งไม่ได้หมายความว่าจะเป็นสำหรับsharedsecurity reasons

โชคดี.

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.