ประเภทของการรับรองความถูกต้อง

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

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

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

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

การตรวจสอบสิทธิ์ด้วยรหัสผ่าน

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

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

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

มาเจาะลึกถึงวิธีการทำกัน

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

เริ่มจากเส้นทางการลงทะเบียนของเรา

เส้นทางการลงทะเบียนของเราสามารถรองรับได้สองวิธีคือ "GET" และ "POST" หากลูกค้าส่งคำขอ "GET" เราจะส่งคืนหน้าลงทะเบียน

โปรดทราบว่าพารามิเตอร์ที่ตั้งค่าไว้สำหรับ render_template ช่วยให้ฉันใช้ไฟล์ html เดียวกันซ้ำได้สำหรับทั้งหน้าเข้าสู่ระบบและหน้าลงทะเบียน

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

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

เราเรียกใช้ฟังก์ชัน login_user ซึ่งตั้งค่าคุกกี้สำหรับเซสชันของผู้ใช้และส่งคืนการตอบสนองการเปลี่ยนเส้นทางเพื่อเปลี่ยนเส้นทางผู้ใช้ไปยังหน้าแรก (เราเคยใช้สิ่งนี้มาก่อนในส่วนที่ 1)

def login_user():
    id = "".join(random.sample(letters, 10))
    resp = make_response(redirect(url_for("home")))
    resp.set_cookie("auth_cookie", id)
    return resp, id

ในเส้นทางดัชนีของเรา เราจะดึงข้อมูลคุกกี้ “auth_cookie” และเรียกใช้ฟังก์ชันดึงข้อมูล_user เพื่อรับผู้ใช้ที่เป็นเจ้าของเซสชันนี้

def retrieve_user(cookie):
    user_email = cookies.get(cookie, "")
    user_details = database.get(user_email, {})
    return user_email, user_details

หากไม่พบผู้ใช้ เราจะเปลี่ยนเส้นทางไคลเอนต์ไปยังหน้าเข้าสู่ระบบ

ตอนนี้เราเสร็จสิ้นขั้นตอนการตรวจสอบสิทธิ์หลักแล้ว เรามาพูดถึงแอปของเรากันดีกว่า

แอปของเรามีฟังก์ชันหลักสองฟังก์ชัน ให้เงินแก่ผู้ใช้และยังอนุญาตให้ผู้ใช้ใช้จ่ายเงินอีกด้วย

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

โฟกัสที่นี่จะอยู่ที่สี่บรรทัดแรก ก่อนอื่นเราจะดึงค่าของคุกกี้ “auth_token” จากนั้นเราจะส่งต่อไปยังจุดสิ้นสุดผู้ใช้ที่ดึงข้อมูล ซึ่งจะดึงข้อมูลผู้ใช้ที่มีเซสชันเชื่อมโยงกับคุกกี้ที่กำหนด หากไม่มีผู้ใช้ พบว่าเราส่งคืนการตอบกลับที่ไม่ได้รับอนุญาต

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

การตรวจสอบสิทธิ์แบบไร้รหัสผ่าน

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

การตรวจสอบสิทธิ์แบบไม่ใช้รหัสผ่านคืออะไร

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

ขั้นตอนการตรวจสอบสิทธิ์แบบไร้รหัสผ่านด้วย OTP

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

เราจะแก้ไขขั้นตอนการตรวจสอบสิทธิ์สำหรับแอปทางการเงินของเราให้ใช้การตรวจสอบสิทธิ์แบบไม่ใช้รหัสผ่าน

@app.route("/register", methods=["POST", "GET"])
def register():
    if request.method == "GET":
        return render_template(
            "login.html",
            page="Registration Form",
            action="Register",
            alt="Already have an account",
            alt_text="Login",
            alt_route="/login",
        )

    email = request.form.get("email")
    resp = send_otp(mail, email)
    return resp

นี่คือจุดสิ้นสุดการลงทะเบียนที่แก้ไขซึ่งจะดึงที่อยู่อีเมลที่ลูกค้าส่งมาและเรียกใช้ฟังก์ชัน send_otp เพื่อสร้างและส่งรหัสผ่านครั้งเดียว (OTP) ที่ไม่ซ้ำกันไปยังที่อยู่อีเมลที่ให้ไว้:

def send_otp(mail, email):
    token = "".join(random.sample(letters, 5))
    msg = Message("Login Token", sender=email_address, recipients=[email])
    msg.body = f"Your login token is {token}"
    print(msg.body)

    tokens[token] = email
    mail.send(msg)
    resp = make_response(redirect(url_for("verify_otp")))
    return resp

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

@app.route("/verify_otp", methods=["POST", "GET"])
def verify_otp():
    if request.method == "GET":
        return render_template(
            "login.html",
            page="Verify OTP",
            action="Verify",
            alt="Don't have an account",
            alt_text="Register",
            alt_route="/register",
        )
    otp = request.form.get("otp")

    if not otp:
        flash("OTP not provided")
        return redirect(url_for("verify_otp"))

    email = tokens.get(otp)

    if not email:
        flash("Invalid OTP provided")
        return redirect(url_for("verify_otp"))

    resp, id = login_user()
    cookies[id] = email

    if not database.get(email):
        database[email] = {"balance": 400}
    return resp

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

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

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

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

แม้ว่าตัวอย่างที่ให้ไว้นี้จะตรงไปตรงมา แต่การสร้างระบบการตรวจสอบสิทธิ์ระดับการใช้งานจริงจำเป็นต้องมีมาตรการเพิ่มเติม เราต้องตรวจสอบอินพุตของผู้ใช้อย่างละเอียด รวบรวมข้อมูลเพิ่มเติมเกี่ยวกับผู้ใช้ จัดเก็บข้อมูลที่รวบรวมไว้ในฐานข้อมูลที่ปลอดภัย และจัดให้มีการตรวจสอบความปลอดภัยเพิ่มเติม เช่น การป้องกัน Cross-Site Request Forgery (CSRF) สำหรับการตรวจสอบสิทธิ์แบบไม่ใช้รหัสผ่าน

ในบทความที่กำลังจะมาถึง เตรียมพร้อมที่จะดำดิ่งลงสู่โลกแห่งการรับรองความถูกต้องอันน่าทึ่ง ขณะที่เราสำรวจวิธีการใช้การรับรองความถูกต้องแบบหลายปัจจัยและเจาะลึกการทำงานของ Single Sign On (SSO) เราจะไม่เพียงแต่เรียนรู้วิธีการทำงาน แต่ยังค้นพบวิธีการใช้ SSO ของเราเองกับนักเทียบท่าอีกด้วย

อย่าพลาดบทความถัดไปของฉัน! ติดตามบัญชีสื่อของฉันเพื่อติดตามเนื้อหาล่าสุดของฉัน