ออกแบบมาเพื่อรับรองความถูกต้องของ Facebook ในแอพ iOS ที่เข้าถึงบริการเว็บที่ปลอดภัย


402

เป้าหมาย: อนุญาตให้ผู้ใช้รับรองความถูกต้องกับ Facebook ในแอปพลิเคชัน iOS ซึ่งต้องการการเข้าถึงบริการเว็บที่ได้รับการป้องกันที่ฉันใช้งานอยู่

ข้อสันนิษฐาน: มีระบบการรับรองความถูกต้องดั้งเดิม (และการลงทะเบียน) สำหรับผู้ใช้ที่เลือกที่จะไม่ใช้ Facebook เพื่อลงชื่อเข้าใช้

รายละเอียด:

  • สมมติว่าเราต้องการเสนอตัวเลือกให้ผู้ใช้ลงชื่อเข้าใช้ด้วย Facebook โดยไม่ต้องสร้างบัญชี / ข้อมูลรับรองแยกต่างหากสำหรับระบบของเรา
  • เนื่องจากเราสนับสนุนกลไกการตรวจสอบความถูกต้องดั้งเดิม (ชื่อผู้ใช้และรหัสผ่าน) เรามี ID ผู้ใช้ของเราเองและออกโทเค็นการตรวจสอบความถูกต้องที่ใช้สำหรับการโต้ตอบที่ตามมา

ฉันประหลาดใจที่ Facebook ไม่มีแนวทางปฏิบัติที่ดีที่สุดสำหรับสิ่งนี้ในเอกสารสำหรับนักพัฒนาซอฟต์แวร์ เอกสารที่มีอยู่ทั้งหมดนั้นสมมติว่าคุณกำลังสร้าง FB auth ไว้ในเว็บไซต์หรือแอพมือถือแบบสแตนด์อโลนที่ไม่มีบริการที่ต้องใช้การตรวจสอบสิทธิ์

นี่คือความคิดเริ่มต้นของฉันเกี่ยวกับวิธีการออกแบบ แต่ต้องการตรวจสอบว่าถูกต้องหรือไม่

  1. ลูกค้าปรากฏการเข้าสู่ระบบ Facebook iOS
  2. ผู้ใช้ UI ลงชื่อเข้าใช้ด้วยข้อมูลรับรอง Facebook และเข้าถึงโทเค็น
  3. iOS App ส่งโทเค็นการเข้าถึงไปยังเซิร์ฟเวอร์ของเรา
  4. เซิร์ฟเวอร์ของเราพูดคุยกับ FB กราฟ API โดยใช้โทเค็นการเข้าถึงเพื่อ (a) ตรวจสอบโทเค็นและ (b) รับ ID ผู้ใช้ FB สำหรับโทเค็นการเข้าถึงนั้น

    เช่นเซิร์ฟเวอร์ของเราจะเรียกhttps://graph.facebook.com/me/?access_token=XYZซึ่งจะส่งคืนข้อมูลโปรไฟล์ในวัตถุ JSON

  5. เซิร์ฟเวอร์ของเราแยก ID ผู้ใช้จากวัตถุ JSON และตรวจสอบว่าผู้ใช้มีบัญชีอยู่แล้วหรือไม่ ถ้าเป็นเช่นนั้นเราจะออกตั๋วรับรองความถูกต้องให้กับลูกค้าเพื่อใช้สำหรับเซสชันนั้น หากผู้ใช้ไม่มีบัญชีเราจะสร้างบัญชีใหม่ด้วย ID ผู้ใช้ Facebook กำหนด ID ผู้ใช้เฉพาะของเราเองและออกตั๋วรับรองความถูกต้องของเรา

  6. จากนั้นลูกค้าจะผ่านตั๋วรับรองความถูกต้องอีกครั้งหลังจากการโต้ตอบที่ต้องการการรับรองความถูกต้อง

ดูเหมือนว่าวิธีการที่เหมาะสมสำหรับฉัน แต่ไม่แน่ใจว่าฉันขาดสิ่งพื้นฐานอย่างเมามันและลงเส้นทางที่ผิด (ซับซ้อน)


1
วิธีนี้แก้ไขได้อย่างไร ฉันกำลังมองผ่านโทเค็นการเข้าถึงเช่นกันและหมุนผู้ใช้บนเซิร์ฟเวอร์ ดูเหมือนนักวิชาการ แต่ฉันกำลังถาม
Chris Van Buskirk

นี่คือการดำเนินการของฉันโดยใช้ทางรถไฟและประดิษฐ์: stackoverflow.com/questions/7232490/…
Matt

ทำไมไม่ผ่านทั้ง auth_hash แทนที่จะต้องทำการโทรสองครั้งไปที่ FB API (หนึ่งจากอุปกรณ์ iOS และอีกครั้งจากเซิร์ฟเวอร์)
bsiddiqui

1
ถ้าคุณต้องการที่จะเข้าสู่ระบบจากอุปกรณ์ที่แตกต่างกัน (หมายความว่าคุณไม่มีตั๋วรับรองความถูกต้องของคุณ)? และถ้าคุณเพิ่งได้รับตั๋ว auth ใหม่สิ่งที่ป้องกันไม่ให้ใครบางคนจากการไฮแจ็ก facebook id / token และใช้บนอุปกรณ์ของเขาเอง?
Amitloaf

จากความอยากรู้ในขั้นตอนที่ 5 ทำไมต้องออกตั๋วรับรองความถูกต้องของคุณเอง คุณไม่สามารถใช้โทเค็นการเข้าถึง Facebook สำหรับการโทรเซิร์ฟเวอร์ทุกครั้งได้หรือไม่ ฉันรู้ว่ามันจะต้องมีการโทรจากเซิร์ฟเวอร์ไปยัง Facebook API สำหรับทุกแอป -> การโทรเซิร์ฟเวอร์แทนที่จะเป็นเพียงการโทรครั้งแรก
Anders

คำตอบ:


80

ฉันแค่จัดการกับตัวเองและนี่คือส่วนที่ทำให้ฉัน:

ในขั้นตอนที่ 5 ของคุณ ... เป็นไปได้หรือไม่ที่ผู้ใช้จะลงทะเบียนบัญชีกับคุณโดยสิ้นเชิงแยกจาก ID Facebook ของพวกเขาใช่ไหม จากนั้นบางครั้งพวกเขาก็เข้าสู่ระบบด้วย Facebook .... และคุณเพิ่งสร้างบัญชีที่สองและทำบัญชีแรกหาย

จำเป็นต้องมีวิธีในการลงชื่อเข้าใช้บริการเว็บของคุณจากนั้นลงชื่อเข้าใช้ Facebook และจับการเชื่อมโยงระหว่าง ID Facebook และบัญชีท้องถิ่น

นอกเหนือจากนั้นแผนของคุณฟังดูมั่นคง

ปรับปรุง : Facebook ได้เพิ่มเอกสารการสรุปสถานการณ์ดังกล่าวที่นี่


7
ใช่ฉันได้พิจารณาแล้วและคุณก็พร้อม เราวางแผนที่จะรวมบัญชีหากเป็นที่อยู่อีเมลเดียวกันและหากไม่มีเราจะสร้างวิธีอื่นในการรวมบัญชีเหล่านั้น
TMC

คุณใช้ไลบรารีเซิร์ฟเวอร์ใดในฝั่งเซิร์ฟเวอร์เพื่อทำการร้องขอ
TimLeung

7
@TimLeung - ความเข้าใจของฉันคือโทเค็นการเข้าถึงฝังรหัสแอปและคุณไม่สามารถมีโทเค็นการเข้าถึงได้โดยไม่ต้องมี ID แอปที่ถูกอบเข้าไป
Dan Ray

1
@TimLeunge: เรากำลังใช้ Graph API สำหรับคำขอที่มีโทเค็นการเข้าถึงของผู้ใช้
TMC

29

ใช้ https เพื่อส่งโทเค็นรับรองความถูกต้องไปยังเซิร์ฟเวอร์ของคุณตามที่ระบุไว้โดย Facebook

การแชร์โทเค็นการเข้าถึง

นโยบายข้อมูลของเราห้ามมิให้มีการแชร์ Token สำหรับแอพของคุณกับแอพอื่นใด ๆ อย่างไรก็ตามเราอนุญาตให้นักพัฒนาแบ่งปันโทเค็นระหว่างการติดตั้งเนทีฟและการติดตั้งเซิร์ฟเวอร์ของแอพเดียวกัน (เช่นใช้ ID แอปเดียวกัน) ตราบใดที่การถ่ายโอนเกิดขึ้นโดยใช้ HTTPS


16

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

แต่มันก็ไม่ได้ฟังดูอันตรายมากนัก โดยทั่วไปผู้คน / แอปพยายามปกป้องโทเค็นการเข้าถึงแทนที่จะแบ่งปันพวกเขา

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

มันค่อนข้างยาว แต่ฉันคิดว่ามันใช้งานได้

แก้ไข: ดูเหมือนว่ามีวิธีการตรวจสอบโทเค็นการเข้าถึงหลังจากทั้งหมด ดูคำตอบโดย @Daaniel กับคำถามid ของแอพลิเคชันได้รับจากการเข้าถึงของผู้ใช้ token (หรือตรวจสอบแอพลิเคชันที่มาสำหรับโทเค็น)


การส่งappsecret_proofควรป้องกันสิ่งนี้ (ดูที่นี่ )
Tony

@ Tony คุณสามารถอธิบายวิธีappsecret_proofช่วยที่นี่? เท่าที่ฉันเข้าใจมีหน้าที่พิสูจน์ให้ Facebook เห็นว่าเซิร์ฟเวอร์รู้รหัสลับ อย่างไรก็ตาม ivant หมายถึงแอพที่เป็นอันตรายที่ได้รับโทเค็นแล้วส่งไปยัง API ของคุณ เซิร์ฟเวอร์สามารถตรวจสอบ ID แอปได้ แต่แอปที่เป็นอันตรายสามารถปลอมแปลง ID แอปได้อย่างง่ายดาย ดังนั้น ... เราจะลดขนาดนี้ได้อย่างไร
YSK

3
คุณสามารถตรวจสอบว่าโทเค็นถูกสร้างขึ้นสำหรับแอปของคุณhttps://graph.facebook.com/app/?access_token=[user_access_token]ซึ่งส่งคืนรหัสแอพแล้วเปรียบเทียบรหัสแอพ
Nader Alexan

4

โซลูชันของคุณใช้งานได้อย่างสมบูรณ์

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


3
ฉันสามารถหาวิธีที่ลูกค้าพูดคุยกับเซิร์ฟเวอร์ได้อย่างง่ายดาย จากนั้นฉันก็สามารถส่งอีเมลได้จนกว่าฉันจะได้รับความนิยม ต้องมีรูปแบบการยืนยันเสมอ
Chris

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