AWS Cognito Federated Identities สำหรับผู้ให้บริการโซเชียลหลายราย: ควรรวมข้อมูลประจำตัวหรือแยกออกจากกันดีกว่าไหม
สามารถรวม AWS Cognito Federated Identities หลายรายการ (เช่นการเข้าสู่ระบบของ Facebook และ Google สำหรับอีเมลเดียวกัน) ให้เป็นข้อมูลประจำตัวเดียวโดยส่งการเข้าสู่ระบบทั้งสองในการโทร Cognito แต่การรู้ว่าฉันสามารถผสานอัตลักษณ์ไม่ได้ตอบโจทย์ว่าฉันควรผสานอัตลักษณ์หรือไม่
ข้อดีข้อเสียของการรวมอัตลักษณ์กับการแยกตัวตนออกจากกันคืออะไร? (เราจัดเก็บโปรไฟล์ผู้ใช้ไว้ในฐานข้อมูลของเราเองเราไม่ได้ใช้ Cognito User Pools หากเราไม่รวมข้อมูลประจำตัวฐานข้อมูลส่วนหลังของเราจะจัดเก็บการแมปรหัสประจำตัวแต่ละตัวกับ ID ผู้ใช้ที่ถูกต้องไว้ด้านหลัง สิ้นสุดฐานข้อมูล)
นี่คือขั้นตอนการทำงานปัจจุบันของแอพเมื่อผู้ใช้คนเดียวกันพยายามที่จะรับรองความถูกต้องโดยใช้ทั้ง Facebook และ Google:
- ในไคลเอนต์ (เป็นเว็บแอป) ผู้ใช้ใหม่คลิกเข้าสู่ระบบและเลือกเข้าสู่ระบบโดยใช้ Facebook
- รหัสไคลเอ็นต์จะบันทึกผู้ใช้เข้าสู่ Cognito Federated Identities และรับรหัสประจำตัวแบบรวมใหม่ที่ได้รับอนุญาตให้เรียกใช้ฟังก์ชัน AWS Lambda ของเรา
- ไคลเอนต์เรียก
getOrCreateUserProfileใช้ฟังก์ชัน Lambda ซึ่งใช้ Cognito Identity ID เป็นคีย์เพื่อดูว่าข้อมูลประจำตัว Cognito นั้นเชื่อมโยงกับผู้ใช้แล้วหรือไม่ - เนื่องจากไม่พบผู้ใช้รายอื่นที่มีรหัสประจำตัวนี้ในฐานข้อมูลของเราและเนื่องจากไม่มีผู้ใช้รายอื่นที่มีที่อยู่อีเมลนี้ (เนื่องจากเป็นผู้ใช้ใหม่ล่าสุด) ฟังก์ชัน Lambda ของเราจะสร้างโปรไฟล์ผู้ใช้ใหม่ในฐานข้อมูลของเราและส่งคืนโปรไฟล์ กลับไปยังผู้ใช้
- ในภายหลังผู้ใช้พยายามเข้าสู่ระบบ (บนอุปกรณ์เดียวกันหรือบนอุปกรณ์อื่น) โดยใช้ Google
- มีการสร้างข้อมูลประจำตัวแบบรวมศูนย์ใหม่สำหรับข้อมูลประจำตัว Google นี้
getOrCreateUserProfileฟังก์ชัน Lambda ของเราไม่พบผู้ใช้ที่มีอยู่ที่ตรงกับรหัสประจำตัวนี้ แต่จะพบผู้ใช้รายอื่นที่มีที่อยู่อีเมลเดียวกัน
ณ จุดนี้เรามีสามทางเลือก:
- A) ส่งคืนข้อผิดพลาดให้กับผู้ใช้เช่น "กรุณาเข้าสู่ระบบด้วยบัญชี Facebook ของคุณ" นี่คือพฤติกรรมปัจจุบันที่เราต้องการเปลี่ยนแปลง
- B) ผสานข้อมูลประจำตัวโดยกำหนดให้ผู้ใช้เข้าสู่ระบบโดยใช้ Facebook ด้วยจากนั้นส่งต่อข้อมูลประจำตัวทั้งสองไปยัง Cognito ซึ่งจะรวมเข้าด้วยกัน ดูhttps://stackoverflow.com/a/45045123/126352
- C) เพิ่มแถวการแมปในฐานข้อมูลส่วนหลังของเราเพื่อแมปข้อมูลประจำตัวใหม่กับโปรไฟล์ผู้ใช้ที่มีอยู่ของผู้ใช้ ตอนนี้ผู้ใช้รายนี้จะมีข้อมูลประจำตัวแบบรวมสองตัว: คนหนึ่งใช้ผู้ให้บริการ Facebook คนหนึ่งใช้ผู้ให้บริการ Google
ข้อดีข้อเสียของ option (B) กับ option (C) คืออะไร? ด้านล่างนี้เป็นจุดเริ่มต้นสำหรับการเปรียบเทียบนี้ ฉันพลาดข้อดี / ข้อเสียอะไรบ้าง?
ผสานเอกลักษณ์
- มือโปร
- การค้นหาที่ง่ายขึ้น / เร็วขึ้นเนื่องจากมีเพียงรหัสประจำตัวเดียวต่อผู้ใช้ที่ต้องจัดทำดัชนีที่ส่วนหลัง
- ฉันคิดว่านี่เป็นโซลูชันที่ปลอดภัยที่สุด?
- Con
- กระบวนการรวมตัวเองดูเหมือนซับซ้อนและเกิดข้อผิดพลาดได้ง่าย ตัวอย่างเช่นหลังจากการรวมหาก ID ใหม่ "ชนะ" การผสานเราจะต้องแทนที่ ID เก่าด้วย ID ใหม่ในโปรไฟล์ผู้ใช้ ... และหากมีบางอย่างผิดพลาดในระหว่างกระบวนการนั้นเราอาจถูกทิ้งไว้ใน สถานะที่ไม่สามารถกู้คืนได้โดยที่ Cognito รู้เฉพาะ ID ใหม่ (รวม) แต่ฐานข้อมูลของเรารู้เกี่ยวกับ ID เก่าเท่านั้น
- UX ที่ซับซ้อนมากขึ้นซึ่งผู้ใช้ต้องเข้าสู่ระบบ (แม้ว่าจะเพียงครั้งเดียว) ทั้งบัญชี Facebook และ Google ในเซสชันเดียวกันเพื่อเชื่อมโยงบัญชีเหล่านั้น
- การเปลี่ยนแปลงการเชื่อมโยงในภายหลังจะต้องผ่าน Cognito API
แยกกัน
- มือโปร
- Simpler UX: เราสามารถเชื่อมโยงบัญชีโซเชียลโดยจับคู่ที่อยู่อีเมล ไม่จำเป็นต้องเข้าสู่ระบบทั้งสองในเซสชันเดียว
- สามารถควบคุมการเชื่อมโยงภายในฐานข้อมูลส่วนหลังของเราเท่านั้นซึ่งจะทำให้ง่ายต่อการสร้างเครื่องมือผู้ดูแลระบบที่เพิ่ม / ลบ / เปลี่ยนข้อมูลประจำตัว -> ลิงก์โปรไฟล์ผู้ใช้แทนที่จะต้องเรียกใช้ Cognito's API เพื่อดำเนินการเหล่านี้
- ไม่มีความเสี่ยงที่ Cognito จะไม่ซิงค์กับฐานข้อมูลส่วนหลังของเรา หากการเชื่อมโยงล้มเหลวผู้ใช้สามารถลองใหม่ได้
- Con
- ต้องการดัชนีจำนวนมาก: 1 เพื่อแมปรหัสประจำตัว -> โปรไฟล์ผู้ใช้แทนที่จะเป็นคอลัมน์เดียวที่จัดทำดัชนี
- นี่เป็นโซลูชันที่มีความปลอดภัยน้อยหรือไม่ ถ้าเป็นเช่นนั้นทำไม?
- ค่าบริการ AWS มีค่าใช้จ่ายมากกว่านี้หรือไม่ ถ้าเป็นเช่นนั้นทำไม?
ฉันเอนเอียงไปที่โซลูชัน "แยกส่วนกัน" เพราะดูเหมือนว่าจะใช้งานได้ง่ายกว่า (ไม่มีเวิร์กโฟลว์ UX เพิ่มเติม) และง่ายกว่าสำหรับผู้ใช้ (ด้วยเหตุผลเดียวกันคือไม่มีเวิร์กโฟลว์ UX ใหม่) ถือเป็นความผิดพลาดหรือไม่?
คำตอบ
เป็นเรื่องยากมากที่จะให้คำตอบแก่คุณฉันคิดว่าคุณได้ระบุข้อดีข้อเสียของแนวทางแก้ไขที่เป็นไปได้ทั้งหมดแล้ว
ฉันจะพยายามชี้แจงเฉพาะบางส่วนเท่านั้นซึ่งฉันถือว่าเป็นกุญแจสำคัญในการเลือกวิธีแก้ปัญหาหนึ่งวิธีไม่ใช่วิธีอื่น
ก่อนอื่นระบุว่าฉันต้องการโซลูชันแยกต่างหาก ให้ฉันพยายามอธิบายว่าทำไม
จากมุมมองของ UX เป็นที่ชัดเจนว่าโซลูชันแยกต่างหากเป็นแนวทางที่ดีกว่ามากสำหรับผู้ใช้ ในการผสานข้อมูลประจำตัวของผู้ให้บริการโซเชียลต่างๆผู้ใช้ต้องเข้าสู่ระบบด้วยในขั้นตอนการสมัครใช้งานแอปพลิเคชันที่ซับซ้อนมากขึ้น แต่กระบวนการนี้มีแรงจูงใจสำหรับการตัดสินใจทางเทคนิคเท่านั้นและจะไม่ให้ประโยชน์ที่แท้จริงแก่ผู้ใช้
ฉันคิดว่าวิธีแก้ปัญหาที่ดีกว่าและง่ายกว่านั้นคือเพียงแค่รวมการทำแผนที่ระหว่างข้อมูลประจำตัวแต่ละรายการกับอีเมลที่เกี่ยวข้องตามที่คุณเสนอในโซลูชันแยกต่างหากจากนั้นให้ผู้ใช้ล็อกอินเข้าสู่แอปพลิเคชันกับผู้ให้บริการที่ตนต้องการอย่างโปร่งใส " ผสาน "ในรหัสแอปพลิเคชันของคุณกลไกการลงชื่อเข้าใช้ทั้งหมดนี้ ข้อกำหนดนี้สามารถทำได้อย่างง่ายดายโดยไม่คำนึงถึงประเภทของระบบข้อมูลพื้นฐานที่คุณใช้ในการจัดเก็บข้อมูลผู้ใช้
โปรดคิดด้วยว่าจะเกิดอะไรขึ้นหากคุณจำเป็นต้องรวมผู้ให้บริการโซเชียลรายอื่นไว้ในแอปพลิเคชันของคุณและผู้ใช้ที่มีอยู่แล้วต้องการลงชื่อเข้าใช้แอปพลิเคชันของคุณกับผู้ให้บริการรายใหม่นั้นจะรวมข้อมูลประจำตัวอย่างไร ผู้ใช้ควรทำขั้นตอนซ้ำอีกครั้งหรือไม่?
นอกจากนี้ฟังก์ชันการผสานข้อมูลประจำตัวยังเป็นสิ่งที่เฉพาะเจาะจงสำหรับ Cognito หากคุณใช้โซลูชันการผสานคุณกำลังเสี่ยงที่จะเชื่อมโยงแอปพลิเคชันของคุณกับ AWS และ AWS Cognito อย่างแน่นหนา หากคุณต้องการย้ายแอปพลิเคชันของคุณไปยังผู้ให้บริการระบบคลาวด์รายอื่นหรือการปรับใช้ในองค์กรคุณอาจไม่มีความสามารถในการเชื่อมโยงดังกล่าว อีกครั้งการทำแผนที่ระหว่างข้อมูลประจำตัวบางประเภทและรูปแบบผู้ใช้ภายในของคุณที่นำมาใช้ในโซลูชันแยกต่างหากดูเหมือนจะเป็นแนวทางที่ดีกว่าและพกพาได้
ความเสี่ยงที่จะไม่ซิงค์กับ Cognito อาจเป็นปัญหาใหญ่อีกประการหนึ่ง กลไกการกู้คืนจะเป็นอย่างไร?
ข้อเสียที่แท้จริงเพียงประการเดียวของโซลูชัน Keep แยกต่างหากคือคุณอาจต้องเสียค่าใช้จ่ายเพิ่มเติมจาก AWS ดังที่คุณเห็นในเอกสารการกำหนดราคาผลิตภัณฑ์ AWS จะเรียกเก็บเงินจากคุณสำหรับผู้ใช้ที่ใช้งานอยู่ทุกเดือน (MAU) หากคุณมีข้อมูลประจำตัวมากขึ้นเช่นเดียวกับโซลูชัน Keep แยกต่างหากอาจเป็นไปได้ว่าจะมี MAU มากขึ้นและคุณอาจต้องเสียค่าใช้จ่ายที่สูงขึ้น ไม่ว่าในกรณีใดค่าใช้จ่ายเหล่านี้จะไม่สูงขึ้นมากนักและอย่างไรก็ตามฉันเชื่อว่าข้อได้เปรียบของโซลูชันที่แยกต่างหากจะช่วยชดเชยการเพิ่มขึ้นของราคาขั้นต่ำนี้
สุดท้ายนี้ฉันไม่คิดว่าโซลูชัน Keep แยกต่างหากเป็นตัวเลือกที่ปลอดภัยน้อยกว่าแม้ว่าดูเหมือนว่าคุณจะรวมข้อมูลประจำตัวเพื่อให้ผู้ใช้ของคุณโต้ตอบกับบริการของ AWS ได้ แต่จะมีการใช้นโยบายและบทบาทเดียวกันโดยไม่คำนึงถึงข้อมูลประจำตัวจริงที่ผู้ใช้ระบุ .
ฉันคิดว่าโซลูชันการผสานจะเหมาะที่สุดสำหรับสถานการณ์ที่คุณมีการรวมศูนย์และจำเป็นต้องระบุผู้ใช้โดยไม่ซ้ำกันโดยไม่คำนึงถึงวิธีการตรวจสอบสิทธิ์ แต่อาจบังคับใช้นโยบายบางประเภท (การสมมติบทบาทที่กำหนดเองเป็นต้น) ที่เกี่ยวข้องกับการใช้ทรัพยากร AWS ตาม เฉพาะในข้อมูลประจำตัวเหล่านั้นและอาจเป็นไปได้ว่าเมื่อคุณไม่มีแบ็กเอนด์ของแอปพลิเคชัน
โดยไม่คำนึงถึงโซลูชันที่นำมาใช้ในที่สุดปัจจัยแห่งความสำเร็จที่สำคัญคือการรักษารูปแบบผู้ใช้และตรรกะที่เกี่ยวข้องให้เป็นอิสระมากที่สุดเท่าที่จะเป็นไปได้ของกลไกที่ใช้ในการตรวจสอบผู้ใช้: โซลูชันที่แยกจากกันยังช่วยในการคิดในลักษณะนั้น
จากมุมมองของผู้ใช้อาจรู้สึกสับสนและไม่สบายใจที่ต้องลงชื่อเข้าใช้ผ่านผู้ให้บริการรายที่สองเพียงเพื่อพบว่าพวกเขาไม่มีเนื้อหาก่อนหน้านี้เลย จากมุมมองนี้ฉันคิดว่าการรวมจะเป็นเป้าหมายสุดท้ายที่ดีที่สุด
ตอนนี้จากมุมมองทางเทคนิคฉันมีความผันผวนและพบว่ามันค่อนข้างยุ่งยาก ฉันจัดการเพื่อรวมข้อมูลประจำตัวเมื่อผู้ใช้เข้าสู่ระบบด้วยอีเมลเป็นครั้งแรกจากนั้นใช้โซเชียล แต่ไม่ใช่ในทางอื่น ฉันเดาว่าทางเลือกเดียวคือต้องมีทริกเกอร์แลมบ์ดาที่ลงทะเบียนล่วงหน้าซึ่งตรวจสอบฐานข้อมูลสำหรับการเข้าสู่ระบบก่อนหน้านี้ในอีเมลนั้น ๆ และขอให้ผู้ใช้ลงชื่อเข้าใช้ด้วยเพื่อทำการผสานหรือเพียงแค่เข้าสู่ระบบต่อไป สิ่งนี้ง่ายกว่าที่จะพูดได้หากมีการเข้าสู่ระบบที่มีอยู่แล้วมากกว่าหนึ่งรายการ
สำหรับคำถามที่ว่าใคร "ชนะ" การผสานมันเป็นสิ่งที่มีอยู่แล้วเสมอ ในท้ายที่สุดมันก็ไม่สำคัญเนื่องจากการเข้าสู่ระบบทั้งหมดจะใช้รหัสรวม cognito เดียวกันผ่านการโทร