ฉันจะออกแบบเว็บเซอร์ RESTful ให้ใช้บุคคลที่สาม (เช่น Google, Facebook, Twitter) สำหรับการตรวจสอบได้อย่างไร


25

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

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

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


ไม่มีอะไรผิดปกติกับสิ่งที่คุณแนะนำ ฉันคิดว่ามันง่ายกว่าที่จะดูโค้ดตัวอย่างการรวม openid กว่าข้อกำหนดจริงของ oauth และ openid จริง ...
spaceman

คุณใช้ภาษา / แพลตฟอร์มใด คุณไม่จำเป็นต้องบูรณาการล้อเพราะมีกรอบที่จะช่วยคุณได้อย่างมาก :)
RobM

@Rob เว็บเซอร์นั้นโฮสต์บน Salesforce.com แต่สามารถเข้าถึงได้ผ่านทางพร็อกซีซึ่งการเขียนนี้คือ Node.js ที่กล่าวว่ารู้สึกเหมือนคำถามทั่วไปจะใช้กับแพลตฟอร์มทั้งหมด และใช่ฉันหวังว่าจะใช้เฟรมเวิร์กแทนที่จะสร้างล้อใหม่ แต่ไม่แน่ใจว่าจะใช้ล้อแบบใด
Ralph Callaway

@Ralph Yep คำถามทั่วไปไม่คำนึงถึงแพลตฟอร์ม แต่มันมีความหมายในทางปฏิบัติเนื่องจากแพลตฟอร์มโดยทั่วไปจะแคบลงกรอบตัวเลือกของคุณค่อนข้างน้อย ดังนั้นคุณมีแอป Front-end ที่สร้างขึ้นเองโดยใช้ node.js ไปยังเว็บเซิร์ฟเวอร์และที่เก็บข้อมูลที่โฮสต์โดยพนักงานขายหรือไม่ คุณจำเป็นต้องจัดเก็บข้อมูลผู้ใช้ / ข้อมูลประจำตัวในแบ็กเอนด์หรือเพียงแค่การตรวจสอบและอนุมัติในการดำเนินการในส่วนหน้า?
RobM

@RobM ใช่เราจะต้องการเก็บข้อมูลผู้ใช้ในส่วนแบ็กเอนด์เช่นอีเมลชื่อและนามสกุลและสิ่งที่จำเป็นในการตรวจสอบการโทรในอนาคตจากผู้ใช้บริการเว็บเซอร์เมื่อพวกเขาได้รับการรับรองความถูกต้องแล้ว
Ralph Callaway

คำตอบ:


14

ดูเหมือนว่ามีสองเป้าหมาย:

  1. ง่ายสำหรับผู้ใช้ปลายทางในการรับรองความถูกต้องกับบัญชีโซเชียลที่มีอยู่
  2. ง่ายสำหรับนักพัฒนาที่ใช้บริการเว็บของคุณ

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

1. ง่ายสำหรับผู้ใช้ปลายทางในการรับรองความถูกต้องกับบัญชีโซเชียลที่มีอยู่

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

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

2. ง่ายสำหรับนักพัฒนาที่ใช้เว็บเซอร์วิซของคุณ

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

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

TL; DR

ทำให้ผู้บริโภคของ API ของคุณเช่นคุณโดยใช้ OAuth2 และซ่อนความซับซ้อนของการตรวจสอบสิทธิ์ทางสังคม คุณสามารถทำขั้นตอนการรับส่งข้อมูลเพิ่มเติมด้วย facebook ได้

รูปภาพเนื่องจากรูปภาพ == คำ * 1000:

ป้อนคำอธิบายรูปภาพที่นี่

เราเรียกสิ่งนี้ว่า oauth2-piggy-back ได้ไหม?

ทีละขั้นตอนการไหล

  1. ผู้ใช้ปลายทางเข้าชมเว็บไซต์ที่ใช้ API ของคุณ
  2. ผู้ใช้ปลายทางถูกส่งไปยังเว็บไซต์ของคุณเพื่ออนุญาตหรือลงทะเบียน (oauth2)
  3. ผู้ใช้เลือก Social auth คลิกที่ปุ่ม facebook login
  4. เว็บไซต์ของคุณตั้งค่าคุกกี้หรือตั้งค่าstateใน facebook oauth เพื่อทราบว่าผู้ใช้มาจากที่ใด
  5. ผู้ใช้ปลายทางถูกเปลี่ยนเส้นทางไปที่ Facebook และยอมรับการเชื่อมต่อที่ไซต์ Facebook
  6. ผู้ใช้ปลายทางถูกนำไปยังเว็บไซต์ของคุณเพื่อทำกระบวนการตรวจสอบสิทธิ์ให้กับ Facebook
  7. คุณค้นหาหรือสร้างผู้ใช้ในฐานข้อมูลของคุณ
  8. คุณสร้างเซสชันใหม่บนเซิร์ฟเวอร์ของคุณ
  9. คุณเปลี่ยนเส้นทางผู้ใช้กลับไปที่ไซต์ดั้งเดิมด้วยโทเค็นเซสชันของคุณ

5

วิธีที่จะทำให้มันขยาย

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

คุณต้องการสองคนโชคไม่ดีเพราะทวิตเตอร์ยังไม่ได้เพิ่ม OWuth2 bandwagon

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

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

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

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

ทั้งหมดนี้จะช่วยให้คุณสามารถเพิ่มผู้ให้บริการบุคคลที่สามใหม่ได้อย่างง่ายดาย

ปัญหาโทเค็น

โทเค็นมีเวลา จำกัด ดังนั้นคุณต้องใช้งาน cron สองสามชุดซึ่งสามารถตรวจสอบว่าโทเค็นนั้นยังใช้งานได้มิฉะนั้นคุณต้องลบมัน คุณยังสามารถรีเฟรชโทเค็นโดยกลไกนี้

บางครั้งมันเกิดขึ้นที่ผู้ใช้ถอนโทเค็น เตรียมพร้อมสำหรับสิ่งนี้

การจัดเก็บข้อมูล

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

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

ตรวจสอบกฎหมายท้องถิ่นของคุณสำหรับข้อมูลบางอย่างที่คุณต้องการความระมัดระวังเป็นพิเศษ

สิ่งสุดท้าย อย่าทำผิดที่คุณไม่ได้สร้างบัญชีในบริการของคุณเอง หากผู้ใช้ถูกแบนจาก facebook เขาจะไม่สามารถลงชื่อเข้าใช้บริการของคุณได้อย่างมีประสิทธิภาพ นี่คือสถานการณ์ที่คุณไม่ต้องการสร้าง สิ่งนี้มักถูกมองข้าม


1

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

ขึ้นอยู่กับสถาปัตยกรรมเว็บไซต์ของคุณคุณอาจพบว่าการใช้ห้องสมุดอย่างEveryAuthหรือPassportนั้นมีประโยชน์มาก


1

สองเซ็นต์ของฉัน: ฉันไม่เคยทำอะไรแบบนี้มาก่อนและไม่รู้ว่ากลไกการล็อกอินของ FB, Twitter หรือ Google ทำงานอย่างไร แต่มีปัญหาบางอย่างเกิดขึ้นในหัวของฉันทันทีที่ฉันอ่านคำถาม:

  • การเข้าสู่ระบบหลายครั้ง:จะเกิดอะไรขึ้นหากฉันเข้าสู่ระบบด้วยบัญชี Facebook ของฉันในวันหนึ่งและบัญชี Google ของฉันในวันถัดไป หรือพร้อมกัน? คุณปฏิบัติต่อทั้งสองบัญชีเป็นบัญชีที่ไม่ซ้ำกันแยกหรือคุณควรมีวิธีการเชื่อมโยงทั้งสองและอนุญาตให้ฉันเข้าถึงตั๋วของฉันด้วยวิธีใด?
  • การใช้ตัวระบุภายนอก:จะเกิดอะไรขึ้นเมื่อ Facebook หรือ Twitter ตัดสินใจเปลี่ยนรูปลักษณ์ตัวระบุบัญชีของพวกเขา เพื่อแสดงให้เห็นว่าถ้า BazLogin แสดงถึงบัญชีที่ไม่ซ้ำกันโดยใช้รหัส {4382-af56} แต่ตัดสินใจว่าจากนี้ไปในบัญชีจะมี 12 หลักเพราะ 8 ไม่เพียงพอคุณจะบอก {1234-4382-af56} จาก {0000-4382 ได้อย่างไร -af56}?

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

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

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