การรับรองความถูกต้องด้วยสองปัจจัยอาจดูเหมือนเป็นกระบวนการที่ซ้ำซากจำเจในส่วนของผู้ใช้ หลายคนคุ้นเคยกับความจริงที่ว่าเมื่อใช้หลาย ๆ แอพพลิเคชั่นการป้อนข้อมูลเข้าสู่ระบบและรหัสผ่านที่คุ้นเคยนั้นไม่เพียงพอ มีการแนะนำปัจจัยการตรวจสอบเพิ่มเติมเพื่อเพิ่มความปลอดภัยและเพื่อป้องกันการเข้าถึงโดยไม่ได้รับอนุญาต ในกรณีส่วนใหญ่ จะเป็นรหัสเฉพาะที่สามารถรับได้ทางอีเมลหรือ SMS
ในบทช่วยสอนนี้ เราจะเรียนรู้วิธีการใช้การตรวจสอบสิทธิ์แบบสองปัจจัยใน AppMaster ดังตัวอย่าง การส่งรหัสไปที่เมล์จะใช้ เราจะวิเคราะห์ว่าโมดูลใดจำเป็นต้องเชื่อมต่อ การตั้งค่าใดที่ต้องทำ กระบวนการทางธุรกิจใดที่จะสร้าง และวิธีการตรวจสอบผลลัพธ์ที่เสร็จสมบูรณ์ในทางปฏิบัติ
อันดับแรก มาดูแผนทั่วไปกันก่อน ขั้นตอนใดที่ต้องดำเนินการในกระบวนการทางธุรกิจของเรา?
- การตรวจสอบการเข้าสู่ระบบ (ตรวจสอบให้แน่ใจว่าผู้ใช้ลงทะเบียนจริง)
- ตรวจสอบว่ารหัสผ่านถูกต้องหรือไม่
- การส่งรหัสยืนยันทางไปรษณีย์หรือ SMS
- การตรวจสอบความเกี่ยวข้องของรหัส
- ตรวจสอบความถูกต้องของรหัส
- เสร็จสิ้นการตรวจสอบสิทธิ์
ขั้นตอนการเตรียมการ
ก่อนที่คุณจะเริ่มออกแบบการยืนยันตัวตนแบบสองปัจจัย ในขั้นตอนการลงทะเบียนผู้ใช้ คุณต้องแน่ใจว่า:
- ข้อมูลผู้ใช้ต้องมีอีเมล จะใช้ในการส่งรหัสยืนยัน อีเมลมักใช้เป็นข้อมูลเข้าสู่ระบบ และเราจะดูตัวอย่างดังกล่าว
- เข้าสู่ระบบไม่ซ้ำกัน ไม่สามารถมีผู้ใช้สองคนที่มีชื่อล็อกอินเดียวกันในระบบได้
เพื่อความสะดวกในการแก้ปัญหาเหล่านี้ (และงานอื่นๆ อีกมากมาย) โมดูล Auth จะถูกติดตั้งตามค่าเริ่มต้นในแต่ละโปรเจ็ AppMaster ประกอบด้วยโมเดลฐานข้อมูลที่จำเป็น บล็อกกระบวนการทางธุรกิจ และจุดสิ้นสุดสำหรับการใช้งาน
การยืนยันการเข้าสู่ระบบ
เข้าสู่ระบบ รหัสผ่าน และรหัสยืนยันถูกใช้เป็นพารามิเตอร์อินพุตของกระบวนการทางธุรกิจ แต่ในขั้นตอนแรกเราต้องการเพียงการเข้าสู่ระบบ จะช่วยให้แน่ใจว่ามีผู้ใช้รายนี้อยู่ เขาได้รับการลงทะเบียนและข้อมูลเกี่ยวกับมันถูกเก็บไว้ในฐานข้อมูล
ในการดำเนินการนี้ บล็อก DB: Search User จะค้นหาผู้ใช้ที่มีการเข้าสู่ระบบที่กำหนดในฐานข้อมูล อย่าลืมตั้งค่าพารามิเตอร์ SearchExact = True เพื่อค้นหาการจับคู่แบบตรงทั้งหมด
ข้อมูลที่ได้รับจะถูกส่งผ่านไปยังบล็อก Array Element ที่มีดัชนี 0 (การนับเริ่มจากศูนย์ และค่าเดียวที่พบจะสอดคล้องกับดัชนี 0 ในอาร์เรย์เสมอ)
บล็อก Is Null ตรวจสอบว่าพบผู้ใช้จริงหรือไม่ และขึ้นอยู่กับผลลัพธ์ ( True/False ) บล็อก If-Else จะขัดจังหวะกระบวนการทางธุรกิจด้วยข้อความแสดงข้อผิดพลาด ( Raise Error block) หรือสั่งให้ดำเนินการต่อไป
ตรวจสอบรหัสผ่าน
ในขั้นตอนนี้ คุณต้องแน่ใจว่าป้อนรหัสผ่านผู้ใช้ถูกต้อง
และที่นี่ สิ่งสำคัญคือต้องเข้าใจว่ารหัสผ่านไม่ได้ถูกจัดเก็บอย่างชัดเจนในฐานข้อมูล ฟังก์ชัน Bcrypt จะแฮช และเฉพาะแฮชผลลัพธ์เท่านั้นที่จะถูกจัดเก็บไว้ในฐานข้อมูล ดังนั้น แม้ว่าเราจะสันนิษฐานว่าข้อมูลรั่วไหล ผู้โจมตีจะยังไม่สามารถค้นหารหัสผ่านของผู้ใช้ได้ มีการเข้ารหัสอย่างปลอดภัย
ด้วยเหตุนี้ คุณจึงไม่สามารถรับรหัสผ่านจากฐานข้อมูลและเปรียบเทียบกับรหัสผ่านที่ป้อนได้ คุณต้องได้รับแฮชของรหัสผ่านและใช้เพื่อเปรียบเทียบ เพื่อแก้ปัญหานี้ จะใช้บล็อก Auth: Probe Password ในฐานะที่เป็นพารามิเตอร์อินพุต จะใช้รหัสผ่านที่ป้อนโดยผู้ใช้ ( password ) และแฮชของรหัสผ่านที่จัดเก็บไว้ในฐานข้อมูล ( hashed_password ) และแปลงเป็นประเภทข้อมูล String (บล็อก To String )
ขึ้นอยู่กับผลลัพธ์ เช่นเดียวกับในขั้นตอนก่อนหน้า โดยใช้บล็อก If-Else เราอาจแสดงข้อความแสดงข้อผิดพลาด ( Raise Error , Message = Password is wrong ) หรือสั่งกระบวนการไปยังขั้นตอนถัดไป
ส่วนขยายรูปแบบผู้ใช้
สำหรับขั้นตอนต่อไป คุณต้องทำการเปลี่ยนแปลงเล็กน้อยในรุ่นของผู้ใช้ และเพิ่มข้อมูลเกี่ยวกับรหัสที่ต้องได้รับการยืนยัน
โดยทั่วไป โมเดล User จะประกอบด้วยฟิลด์ที่สามารถใช้สำหรับงานนี้ได้ - Confirmed, Confirmation code, Confirmation code expires at แต่ในตัวอย่างนี้ เราจะถือว่าช่องเหล่านี้ใช้สำหรับการลงทะเบียนและการยืนยันบัญชีเบื้องต้นเท่านั้น
เพื่อความชัดเจนยิ่งขึ้นของกระบวนการ ลองสร้าง twofa ( two-factor authentication ) แยกกัน เชื่อมโยงโมเดล User กับโมเดลนั้น (ความสัมพันธ์แบบ 1 ต่อ 1 has one ) และเพิ่มฟิลด์ - code ( ประเภท String )
กำลังเตรียมส่งอีเมล
ในการส่งอีเมลพร้อมรหัสยืนยันควรเตรียมตัวเบื้องต้น หนึ่งในตัวเลือกที่สามารถเข้าถึงได้มากที่สุดคือการใช้โมดูล Custom SMTP ซึ่งคุณต้องติดตั้งและกำหนดค่า
เมื่อใช้ Gmail การตั้งค่าส่วนใหญ่จะถูกกำหนดเป็นค่าเริ่มต้นอยู่แล้ว และคุณจะต้องเพิ่มชื่อผู้ใช้และรหัสผ่านของคุณ เมื่อใช้เมลเซิร์ฟเวอร์อื่น คุณควรอ้างอิงเอกสารประกอบเพื่อรับข้อมูลที่จำเป็น
ในกรณีนี้ คุณอาจต้องเปลี่ยนการตั้งค่าความปลอดภัยของเมลเซิร์ฟเวอร์เล็กน้อย ตัวอย่างเช่น Gmail อาจบล็อกการเชื่อมต่อโดยใช้แอปพลิเคชันของบุคคลที่สามโดยค่าเริ่มต้น และคุณต้องลบข้อจำกัดนี้ในการตั้งค่า
กำลังส่งรหัสยืนยัน
เราตรวจสอบข้อมูลเข้าสู่ระบบและรหัสผ่านและดำเนินการเตรียมการที่จำเป็นทั้งหมดเรียบร้อยแล้ว ดังนั้นตอนนี้คุณสามารถดำเนินการส่งจดหมายพร้อมรหัสยืนยันได้
Custom SMTP: Send Email ใช้อาร์เรย์ของที่อยู่เป็นปลายทาง ดังนั้น แม้ว่าคุณจะต้องส่งจดหมายไปยังที่อยู่เดียวเท่านั้น แต่ก็ควรเพิ่มจดหมายนั้นลงในอาร์เรย์ สำหรับสิ่งนี้ จะใช้บล็อก Append Array
ขั้นตอนต่อไปคือการสร้างรหัสยืนยัน บล็อก Random string เหมาะสำหรับสิ่งนี้ เราจะส่งรหัสที่ประกอบด้วยตัวเลขสุ่ม 6 ตัวและทำการตั้งค่าที่เหมาะสม Length = 6, With 0-9 = True พารามิเตอร์อื่นๆ ทั้งหมด = False
ถัดไปคุณต้องสร้างข้อความในจดหมาย ในการดำเนินการนี้ ให้ใช้บล็อก Concat Strings เพื่อเพิ่มข้อความอธิบายลงในรหัสที่สร้างขึ้น ( First = Verification code: ) แปลงผลลัพธ์เป็นประเภทข้อมูล Text ( เป็นบล็อก To Text ) และเชื่อมต่อผลลัพธ์กับพารามิเตอร์ body ของอีเมล บล็อกการส่ง
สำหรับการส่งขั้นสุดท้าย ยังคงเป็นเพียงการระบุหัวเรื่องของจดหมาย ( subject ) และผู้ส่ง ( from_name )
แต่ส่งรหัสอย่างเดียวไม่พอ จะต้องเก็บไว้ในข้อมูลของผู้ใช้ด้วย ท้ายที่สุดคุณต้องตรวจสอบความถูกต้องเมื่อผู้ใช้ได้รับรหัสและส่งกลับเป็นการยืนยัน
ในการทำเช่นนี้ เราจะใช้โมเดล twofa ซึ่งเราสร้างขึ้นอย่างรอบคอบก่อนหน้านี้ หากนี่เป็นการส่งรหัสครั้งแรก คุณต้องสร้างรหัสนั้นด้วยข้อมูลว่าเป็นของผู้ใช้รายใด ในกรณีที่ใช้ซ้ำ จำเป็นต้องแก้ไขรายการที่มีอยู่ โดยระบุ ID และรหัสใหม่
ขั้นตอนสุดท้ายของขั้นตอนคือการใช้บล็อก Raise Error เพื่อส่งคืนข้อความเกี่ยวกับการส่งรหัสไปยังอีเมล
การตรวจสอบความเกี่ยวข้องของรหัส
ควรดูแลความปลอดภัยเพิ่มเติมและปกป้องรหัสจากการแจงนับซ้ำซาก เป็นการดีที่จะจำกัดจำนวนครั้งในการพยายามป้อนข้อมูล ความถี่ และอายุการใช้งานของรหัสที่ส่งมา เราจะไม่วิเคราะห์ตัวอย่างเหล่านี้ทั้งหมด ข้อกำหนดด้านความปลอดภัยเป็นรายบุคคลสำหรับแต่ละโครงการและอาจรวมถึงเงื่อนไขต่างๆ มากมาย เราจำกัดตัวเองในการตรวจสอบความเกี่ยวข้องของรหัสตามระยะเวลาที่ใช้งานได้
ลองใช้บล็อก Current date & time ปัจจุบันเพื่อรับเวลาปัจจุบัน เชื่อมต่อกับพารามิเตอร์ B ของบล็อก Date & time difference เราจะใช้ฟิลด์ UpdatedAt ของโมเดล twofa เป็นพารามิเตอร์ A
เป็นผลให้เราได้รับ Time span - ความแตกต่างระหว่างจุดเวลาสองจุด ยังคงเป็นเพียงการตรวจสอบว่าความแตกต่างนี้เกินค่าที่เลือกหรือไม่ ในตัวอย่างของเรา นี่คือ 5 นาที ซึ่งเราจะตั้งค่าเป็นค่าคงที่ B ของบล็อกที่ Greater
บล็อก If-Else จะใช้ผลการเปรียบเทียบเพื่อเป็นแนวทางในการดำเนินการต่อไป หาก True (ผลต่างเกิน 5 นาที) กระบวนการจะกลับไปสู่ขั้นตอนการส่งจดหมาย ผู้ใช้จะได้รับรหัสที่อัปเดต ในกรณีที่ False (รหัสใหม่และเป็นปัจจุบัน) จะสามารถดำเนินการตรวจสอบรหัสนี้ได้
ตรวจสอบรหัส
ขั้นตอนสุดท้ายของการรับรองความถูกต้องคือการตรวจสอบรหัสที่ได้รับ
บล็อก Equal ต้องตรวจสอบว่ารหัสที่ส่งโดยผู้ใช้ตรงกับรหัสที่จัดเก็บไว้ในโมเดล twofa ที่เชื่อมโยงกับผู้ใช้ หากไม่ใช่กรณีนี้และระบุรหัสไม่ถูกต้อง ( If-Else -> False ) คุณต้องแสดงข้อความแสดงข้อผิดพลาด ( Raise Error , Message = Code is wrong ) หากการเปรียบเทียบยืนยันการจับคู่ คุณสามารถดำเนินการต่อไปยังขั้นตอนการรับรองความถูกต้องขั้นสุดท้าย
ในการทำเช่นนี้ เราใช้บล็อก Auth: Authentication และรับข้อมูลเกี่ยวกับผู้ใช้ด้วยโทเค็นการให้สิทธิ์ เราส่งต่อไปยัง End block อันเป็นผลมาจากการพิสูจน์ตัวตนที่สำเร็จ
การสร้างจุดสิ้นสุด
กระบวนการทางธุรกิจถูกสร้างขึ้น แต่ยังไม่พร้อมใช้งาน คุณต้องสร้างจุดสิ้นสุดที่จะเรียกใช้กระบวนการทางธุรกิจนี้
วิธีแก้ปัญหาที่เหมาะสมคือการใช้จุดสิ้นสุดการตรวจสอบสิทธิ์เริ่มต้น ( POST /Auth ) จะเพียงพอที่จะแทนที่กระบวนการทางธุรกิจและติดตั้งกระบวนการที่เพิ่งสร้างขึ้น ดังนั้น การยืนยันตัวตนอย่างง่ายจะถูกปิดใช้งาน และจะใช้การยืนยันตัวตนแบบสองปัจจัยแทน
เผยแพร่และทดสอบ
การสร้างการรับรองความถูกต้องด้วยสองปัจจัยเสร็จสมบูรณ์ คุณสามารถเผยแพร่ผลลัพธ์และตรวจสอบการทำงานได้ สำหรับสิ่งนี้ สะดวกกว่าที่จะใช้ Swagger ซึ่งสามารถเข้าถึงได้โดยคลิกที่ชื่อแผนการปรับใช้ในส่วน Project API ของปุ่ม Preview
ยังคงเป็นเพียงการค้นหาจุดสิ้นสุดที่ต้องการในรายการ ป้อนข้อมูลผู้ใช้ และเริ่มการดำเนินการด้วยปุ่ม Execute หากพบข้อผิดพลาดใดๆ ในระหว่างการทดสอบ ให้กลับไปที่กระบวนการทางธุรกิจและทำการเปลี่ยนแปลงที่จำเป็น