การตรวจสอบความถูกต้องฝั่งเซิร์ฟเวอร์โทเค็นการเข้าถึง Facebook สำหรับแอพ iPhone


112

ฉันกำลังพัฒนาแอพพลิเคชั่น iPhone ซึ่งใช้การสื่อสารกับเซิร์ฟเวอร์และฉันต้องการใช้กลไกการตรวจสอบสิทธิ์ของ Facebook

โดยทั่วไปฉันคิดว่ามันควรจะเป็นดังนี้:

  1. ในแอพ iPhone ของฉันผู้ใช้เข้าสู่ระบบ Facebook โดยใช้อีเมลและรหัสผ่านของเขา
  2. ผู้ใช้อนุญาตให้เข้าถึงข้อมูลของเขาสำหรับแอปพลิเคชัน Facebook ที่เกี่ยวข้อง
  3. แอพ iPhone ของฉันได้รับโทเค็นการเข้าถึงหลังจากเข้าสู่ระบบสำเร็จ
  4. ในการสื่อสารเพิ่มเติมกับเซิร์ฟเวอร์ของฉันแอปพลิเคชัน iPhone ของฉันควรใช้โทเค็นการเข้าถึง Facebook ที่ได้รับ (ตัวอย่างเช่นในการสืบค้น)
  5. เมื่อเซิร์ฟเวอร์ของฉันได้รับคำถามบางอย่างจากแอพ iPhone ด้วยโทเค็นการเข้าถึงควรถาม Facebook ว่าโทเค็นนี้ถูกต้อง (และสำหรับใคร) และถ้าใช่เซิร์ฟเวอร์ควรถือว่าผู้ใช้นั้นได้รับการรับรองความถูกต้องกับ Facebook

คำถามของฉันคือเซิร์ฟเวอร์ควรถาม Facebook อย่างไรว่าโทเค็นการเข้าถึงที่กำหนดนั้นถูกต้องหรือไม่? ฉันคิดว่าฉันควรตรวจสอบว่าโทเค็นถูกต้องสำหรับแอพ Facebook ของฉันหรือไม่

ฉันได้ลองใช้ข้อความค้นหาของ Facebook หลายครั้งเพื่อสร้างกราฟ API แต่ก็ไม่มีอะไรได้ผลตามที่ฉันคาดไว้ คุณช่วยยกตัวอย่างให้ฉันได้ไหม


5
เว้นแต่ผู้ใช้จะออกจากระบบแอปใน FB คุณสามารถส่งโทเค็นการตรวจสอบสิทธิ์ข้ามไปยังเซิร์ฟเวอร์ (ssl hopefuly) คำถามง่ายๆของ "/ me" ผ่าน API กราฟประสบความสำเร็จหรือล้มเหลว?
The Mad Gamer

คุณจะได้รับข้อความตอบกลับจาก facebook ว่าโทเค็นของคุณไม่ถูกต้อง :)
Jean-Luc Godard

1
ฉันพยายามทำบางสิ่งที่คล้ายกับสิ่งที่คุณกำลังทำอยู่ คุณไม่เคยทำเครื่องหมายคำถามนี้เป็นคำตอบคุณเคยทำให้คำถามนี้ได้ผลหรือไม่?
tempy

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

@debianmaster ขึ้นอยู่กับสถาปัตยกรรมแอปของคุณ หากคุณพิจารณากรณี "ไม่มีโทเค็น FB - ไม่สามารถเข้าถึงแอปได้" ให้ออกจากระบบผู้ใช้ มิฉะนั้นคุณอาจพิจารณาตรรกะ "ยกเลิกการเชื่อมโยง" ซึ่งผู้ใช้ยังคงล็อกอินอยู่ แต่ข้อมูลที่ได้รับจาก Facebook จะถูกแยกออกจากบัญชีของเขาบนเซิร์ฟเวอร์ / ไคลเอนต์
Yevhen Dubinin

คำตอบ:


115

นี่คือกระบวนการสองขั้นตอนที่คุณสามารถใช้เพื่อตรวจสอบว่าโทเค็นการเข้าถึงของผู้ใช้เป็นของแอพของคุณ:

1) สร้างโทเค็นการเข้าถึงแอป

( https://developers.facebook.com/docs/howtos/login/login-as-app/ )

https://graph.facebook.com/oauth/access_token?
client_id=YOUR_APP_ID
&client_secret=YOUR_APP_SECRET
&grant_type=client_credentials

2) ดีบักโทเค็นการเข้าถึงของผู้ใช้

( https://developers.facebook.com/docs/howtos/login/debugging-access-tokens/ )

https://graph.facebook.com/debug_token?
input_token=INPUT_TOKEN
&access_token=ACCESS_TOKEN

โดยที่ INPUT_TOKEN คือโทเค็นการเข้าถึงของผู้ใช้ที่คุณต้องการยืนยันและ ACCESS_TOKEN คือโทเค็นของแอปของคุณที่คุณได้รับจากขั้นตอนที่ 1

จุดสิ้นสุดการดีบักโดยทั่วไปจะทิ้งข้อมูลทั้งหมดเกี่ยวกับโทเค็นดังนั้นมันจะตอบสนองต่อสิ่งนี้:

{
    data: {
        app_id: YOUR_APP_ID,
        is_valid: true,
        metadata: {
            sso: "iphone-safari"
        },
        application: YOUR_APP_NAMESPACE,
        user_id: USER_ID,
        issued_at: 1366236791,
        expires_at: 1371420791,
        scopes: [ ]
    }
}

หากโทเค็นนั้นไม่ได้มาจาก "แอปของคุณ" ระบบจะส่งคืนการตอบสนองข้อผิดพลาด


13
ตาม Facebookนี่เป็นวิธีที่ถูกต้องในการตรวจสอบโทเค็น อย่างไรก็ตามส่วนแรกเป็นทางเลือกเนื่องจากคุณอาจใช้รหัสและข้อมูลลับของแอปแทนผู้ดูแลระบบหรือโทเค็นของแอป
Brandon Zacharie

@BrandonZacharie ไม่เห็นว่าคุณทำสิ่งนี้ได้อย่างไรฉันเพิ่งลองใช้ id และความลับของแอปและทำให้ฉันมีข้อผิดพลาดสำหรับ "input_token parameters required"
Johnny Z

@JohnnyZ ต้องระบุโทเค็นอินพุต โทเค็นการเข้าถึงคือจุดที่มีความยืดหยุ่น
Brandon Zacharie

8
@BrandonZacharie คุณพูดถูกฉันได้รับข้อมูลและการเข้าถึงโทเค็นสับสน ในการใช้รหัสแอปและความลับฉันส่งผ่านสิ่งนี้เป็นพารามิเตอร์โดยมีไพพ์เป็นตัวคั่น: & access_token = APP_ID | APP_SECRET
Johnny Z

2
ลิงค์ด้านบนตอนนี้เป็นdevelopers.facebook.com/docs/facebook-login/access-tokens/…
Chris Prince

115

อัปเดต: คำตอบนี้ดูไม่ปลอดภัยเนื่องจากไม่ได้ตรวจสอบโทเค็นก่อนว่าเป็นของแอปของคุณดูความคิดเห็นคำตอบเดิมได้ดังนี้:

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

https://graph.facebook.com/me?fields=id&access_token=@accesstoken

แทนที่ @accesstoken ด้วยโทเค็นการเข้าถึงที่คุณมี ฉันจะแยก url และจะอธิบายแต่ละ

เรากำลังส่งคำขอกราฟ API ที่นี่ซึ่งจะส่งคืนรหัสผู้ใช้ Facebook ของเจ้าของโทเค็นการเข้าถึงเป็นสตริง JSON คีย์เวิร์ด 'me' หมายถึงผู้ใช้ที่ล็อกอินอยู่หรือเจ้าของโทเค็นการเข้าถึง สำหรับโทเค็นการเข้าถึงการร้องขอนี้เป็นพารามิเตอร์บังคับ

หากโทเค็นการเข้าถึงที่ระบุไม่ถูกต้องหรือหมดอายุ Facebook จะส่งคืนข้อความแสดงข้อผิดพลาดบางประเภท

สำหรับโทเค็นการเข้าถึงที่ถูกต้องผลลัพธ์จะเป็นเช่นนี้

{
   "id": "ID_VALUE"
}

14
คำขอนั้นจะไม่สำเร็จหากผู้ใช้ระบุ access_token ซึ่งเป็นของแอปอื่น
Yuriy Nemtsov

2
สามารถใช้โทเค็นการเข้าถึงของผู้ใช้ที่ถูกต้องได้ (ไม่ว่าจะเป็นของแอปใดก็ตาม)
Robin

12
@Xiquid โพสต์นี้ไม่ใช่วิธีแก้ปัญหาเนื่องจากไม่ได้ตรวจสอบว่าโทเค็นการเข้าถึงเป็นของแอปพลิเคชันของคุณหรือไม่
Kolyunya

12
ไม่เข้าใจว่าทำไมคำตอบนี้ถึงมีคนโหวตมากที่สุด! มันไม่ใช่วิธีแก้ปัญหาที่ถูกต้อง จริงๆแล้วแนวทางที่ถูกต้องคือสิ่งที่ "sebastian the crab" แนะนำ จุดสิ้นสุด debug_token ใช้เพื่อสอบถามข้อมูลเกี่ยวกับโทเค็นเองและด้วยวิธีนี้คุณสามารถตรวจสอบได้ว่าโทเค็นเป็นของ ID ผู้ใช้เฉพาะสำหรับ ID แอปเฉพาะ!
Alex Ntousias

4
ใช่คำตอบนี้ไม่ถูกต้อง หากคุณตรวจสอบโทเค็นการเข้าถึงด้วยวิธีนี้จะมีคนรับโทเค็นการเข้าถึงจากแอปพลิเคชันอื่นและใช้เพื่อตรวจสอบสิทธิ์กับของคุณได้
Jonathan

11

วิธีการแก้ปัญหาอีกก็จะไปใช้https://graph.facebook.com/app/?access_token=[user_access_token]ตามที่อธิบายid ของแอพลิเคชันได้รับจากการเข้าถึงของผู้ใช้โทเค็น (หรือตรวจสอบแอพลิเคชันที่มาสำหรับโทเค็น)

สิ่งนี้ดูเหมือนจะเป็นคุณสมบัติที่ไม่มีเอกสาร แต่ส่งคืน JSON ที่มี id ของแอปที่โทเค็นสร้างขึ้น หากโทเค็นไม่ใช่สำหรับแอปของคุณจะส่งคืน 400


ฉันจะได้รับการจัดอันดับของธุรกิจ Facebook อื่น ๆ ได้อย่างไร ฉันต้องทำอะไรเพื่อสิ่งนี้?
Maneesh Rao

6

ใน facebook เวอร์ชันล่าสุด (2.2) คุณสามารถทำได้ด้วยวิธีนี้:

https://developers.facebook.com/docs/graph-api/reference/v2.2/debug_token

ตัวอย่างผลลัพธ์:

{
    "data": {
        "app_id": "THE APP ID", 
        "application": "APP NAME", 
        "expires_at": 1427245200, 
        "is_valid": true, 
        "scopes": [
        "public_profile", 
        "basic_info", 
        "read_stream", 
        "email", 
        "publish_actions", 
        "read_friendlists", 
        "user_birthday", 
        "user_hometown", 
        "user_location", 
        "user_likes", 
        "user_photos", 
        "user_videos", 
        "user_friends", 
        "user_posts"
        ], 
        "user_id": "THE USER ID"
    }
}

หมายความว่าคุณจะต้องเรียกจุดสิ้นสุด fb นี้ในแต่ละคำขอหรือไม่ ไม่มีวิธีที่ดีกว่าหรือ?
Jdruwe

ใช้งานได้ แต่ต้องใช้โทเค็นการเข้าถึง สามารถสร้างโทเค็นการเข้าถึงได้โดยใช้คำตอบ 'เซบาสเตียนปู' หรือเราสามารถใช้ appid | appsecret Fore more Info developers.facebook.com/docs/facebook-login/…
krishnan

นี่คือตัวอย่างการใช้งาน: stackoverflow.com/a/16947027/32453
rogerdpack

2
private function facebookRequestMe($access_token)
{
    include_once "facebook.php";

    $facebook = new Facebook(array(
        "appId" => "your_application_id",
        "secret" => "your_application_secret"
    ));
    $facebook->setAccessToken($access_token);
    return $facebook->api("/me", "GET");
}

คุณสามารถดาวน์โหลด Facebook SDK สำหรับ PHP จากGitHub


1

หากผู้ใช้ส่งผ่าน Facebook UID ที่อ้างว่าเป็นของพวกเขาและคุณต้องการตรวจสอบว่าเป็น Legit หรือไม่นี่คือฟังก์ชัน Python ที่จะตรวจสอบกับโทเค็นการเข้าถึงของพวกเขา (การใช้คำตอบของ Robin Jome):

def verify_facebook_id(id, access_token):
    import requests
    import simplejson
    params = {'fields': 'id', 'access_token': access_token}
    text = requests.get("https://graph.facebook.com/me", params=params).text
    json = simplejson.loads(text)
    response_id = json["id"]
    return response_id == id

สิ่งนี้ไม่สามารถตรวจสอบได้ว่าโทเค็นถูกสร้างขึ้น "สำหรับแอปของคุณ" น่าเสียดาย ...
rogerdpack

1

นี่เป็นวิธีเดียวที่ปลอดภัยในการตรวจสอบโทเค็นของผู้ใช้โดยใช้คำขอเดียว:

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

สังเกตว่าเครื่องหมาย "|" ใน URL ด้านบนไม่ได้ใช้เป็น OR แต่เป็นตัวคั่นและต้องอยู่ที่นั่นหลังจากกรอกข้อมูลในฟิลด์อื่น ๆ

การตอบสนองจะเป็น JSON โดยมีลักษณะดังนี้:

{
    data: {
        app_id: {app_id},
        application: {app_name},
        expires_at: {some_number},
        is_valid: {true|false}
        scopes: {array_of_permissions},
        user_id: {user_id}
    }
}

ข้อมูลอ้างอิง: https://developers.facebook.com/docs/facebook-login/access-tokens/#apptokens (วิธีการด้านบนระบุไว้ที่ด้านล่างของส่วนนี้)


มีอีกวิธีหนึ่งที่ปลอดภัยสำหรับคำขอเดียว: stackoverflow.com/a/36555287/32453
rogerdpack

-1

นอกจากโทเค็นการเข้าถึงแล้ว Facebook ยังส่งพารามิเตอร์ "expires_in" ซึ่งเป็นค่าออฟเซ็ต ใช้เพื่อคำนวณว่าโทเค็นการเข้าถึงจะหมดอายุเป็น NSDate เมื่อใด จากนั้นเมื่อคุณต้องการทำคำขอให้เปรียบเทียบวันที่ปัจจุบันกับวันหมดอายุ

ลองตรวจสอบรหัสสถานะและสตริงการตอบกลับที่ Facebook ส่งกลับมา

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