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

Passkeys คืออะไร?

Passkeys คือข้อมูลประจำตัวแบบเข้ารหัสที่จัดเก็บบนอุปกรณ์ของคุณ (โทรศัพท์ แล็ปท็อป กุญแจความปลอดภัย) ที่แทนที่รหัสผ่านสำหรับการยืนยันตัวตน พวกมันใช้มาตรฐาน WebAuthn (ส่วนหนึ่งของ FIDO2) และให้ข้อดีหลายประการ:

  • ต้านทานการ Phishing - Passkeys ผูกกับโดเมนของเว็บไซต์ ดังนั้นจึงไม่สามารถใช้บนเว็บไซต์ปลอมได้
  • ไม่มีความลับที่จะรั่วไหล - มีเพียงกุญแจสาธารณะเท่านั้นที่จัดเก็บบนเซิร์ฟเวอร์
  • ผูกกับอุปกรณ์ - กุญแจส่วนตัวไม่เคยออกจากอุปกรณ์ของคุณ
  • ป้องกันด้วยไบโอเมตริก - โดยทั่วไปป้องกันด้วย Face ID, Touch ID หรือ Windows Hello
  • ซิงค์ข้ามอุปกรณ์ - แพลตฟอร์มสมัยใหม่ซิงค์ passkeys ข้ามอุปกรณ์ผ่านบัญชี iCloud, Google หรือ Microsoft

การใช้งานของเรา

เราผสานรวมการรองรับ WebAuthn passkey เข้ากับ django-allauth authentication stack ที่มีอยู่ของเรา โดยให้ทั้ง web และ mobile API endpoints

ขั้นตอนการลงทะเบียน

เมื่อผู้ใช้ลงทะเบียน passkey ใหม่ ขั้นตอนทำงานดังนี้:

  1. ไคลเอนต์ร้องขอตัวเลือกการลงทะเบียน จากเซิร์ฟเวอร์
  2. เซิร์ฟเวอร์สร้าง challenge พร้อมข้อมูลผู้ใช้และ relying party
  3. WebAuthn API ของเบราว์เซอร์ แจ้งเตือนผู้ใช้ (ไบโอเมตริกหรือกุญแจความปลอดภัย)
  4. ไคลเอนต์ส่ง credential กลับไปยังเซิร์ฟเวอร์
  5. เซิร์ฟเวอร์ตรวจสอบและจัดเก็บ กุญแจสาธารณะ
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
# API endpoint เพื่อเริ่มการลงทะเบียน
class WebAuthnRegistrationOptionsView(APIView):
    permission_classes = [IsAuthenticated]

    def get(self, request):
        from allauth.mfa.webauthn.internal import auth as webauthn_auth

        # สร้างตัวเลือกการสร้าง credential
        creation_options = webauthn_auth.begin_registration(
            request.user,
            passwordless=False  # ใช้เป็น 2FA ไม่ใช่ passwordless
        )

        return Response({
            "success": True,
            "creation_options": creation_options,
        })

ขั้นตอนการยืนยันตัวตน

สำหรับการยืนยันตัวตนสองปัจจัยโดยใช้ passkey:

  1. ผู้ใช้ยืนยันตัวตนหลักเสร็จสิ้น (username/password หรือ social login)
  2. เซิร์ฟเวอร์ส่ง challenge สำหรับการตรวจสอบ WebAuthn
  3. เบราว์เซอร์แจ้งเตือน สำหรับ passkey (แตะไบโอเมตริก)
  4. Credential ถูกตรวจสอบ เทียบกับกุญแจสาธารณะที่จัดเก็บ
  5. ผู้ใช้ได้รับการยืนยันตัวตนอย่างสมบูรณ์
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
class WebAuthnVerifyView(APIView):
    def post(self, request):
        credential = request.data.get("credential")

        # ยืนยันตัวตนให้เสร็จสิ้นและตรวจสอบ credential
        authenticator = webauthn_auth.complete_authentication(
            request.user,
            credential
        )

        # บันทึกการใช้งานสำหรับการตรวจสอบความปลอดภัย
        authenticator.last_used_at = timezone.now()
        authenticator.save()

        return Response({"success": True})

การจัดการ Passkey

ผู้ใช้สามารถจัดการ passkeys ที่ลงทะเบียนไว้:

  • แสดงรายการ passkeys ทั้งหมด พร้อมวันที่ลงทะเบียนและการใช้งานล่าสุด
  • เปลี่ยนชื่อ passkeys เพื่อการระบุตัวตนที่ง่ายขึ้น (เช่น “iPhone”, “MacBook”)
  • ลบ passkeys (พร้อมการป้องกันจากการลบ authenticator ตัวสุดท้าย)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
class WebAuthnListView(APIView):
    def get(self, request):
        authenticators = Authenticator.objects.filter(
            user=request.user,
            type=Authenticator.Type.WEBAUTHN
        ).order_by("-created_at")

        return Response({
            "passkeys": [
                {
                    "id": auth.pk,
                    "name": auth.wrap().name,
                    "created_at": auth.created_at.isoformat(),
                    "last_used_at": auth.last_used_at.isoformat() if auth.last_used_at else None,
                }
                for auth in authenticators
            ]
        })

API Endpoints

REST API ของเราให้การรองรับ WebAuthn อย่างสมบูรณ์สำหรับแอปมือถือ:

EndpointMethodคำอธิบาย
/api/webauthn/register/options/GETรับ registration challenge
/api/webauthn/register/complete/POSTลงทะเบียนให้เสร็จสิ้น
/api/webauthn/authenticate/options/GETรับ authentication challenge
/api/webauthn/verify/POSTตรวจสอบ credential สำหรับ 2FA
/api/webauthn/GETแสดงรายการ passkeys ที่ลงทะเบียน
/api/webauthn/<id>/PATCHเปลี่ยนชื่อ passkey
/api/webauthn/<id>/DELETEลบ passkey

ข้อพิจารณาด้านความปลอดภัย

รหัสกู้คืน

เมื่อผู้ใช้ลงทะเบียน authenticator ตัวแรก (passkey หรือ TOTP) เราจะสร้างรหัสกู้คืนโดยอัตโนมัติ รหัสใช้ครั้งเดียวเหล่านี้สามารถใช้ได้หากวิธีการยืนยันตัวตนอื่นๆ ทั้งหมดไม่พร้อมใช้งาน:

1
2
if Authenticator.objects.filter(user=request.user).count() == 1:
    auto_generate_recovery_codes(request._request)

ป้องกันการถูกล็อคออก

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

1
2
3
4
if not adapter.can_delete_authenticator(authenticator):
    return Response({
        "message": "ไม่สามารถลบได้ - คุณต้องมีอย่างน้อยหนึ่งวิธีการยืนยันตัวตน"
    }, status=400)

การตรวจสอบ

เราติดตามการใช้งาน passkey ผ่าน Datadog metrics สำหรับการตรวจสอบความปลอดภัย:

1
2
3
increment("webauthn.registration.success")
increment("webauthn.verify.success")
increment("webauthn.verify.failed")

การรองรับเบราว์เซอร์

WebAuthn รองรับในเบราว์เซอร์สมัยใหม่ทั้งหมด:

  • Chrome 67+
  • Firefox 60+
  • Safari 13+
  • Edge 79+
  • Mobile Chrome, Safari, Firefox

สำหรับเบราว์เซอร์เก่า ผู้ใช้ยังคงสามารถใช้ TOTP (แอป authenticator) หรือรหัสกู้คืนได้

ประสบการณ์ผู้ใช้

การเพิ่ม passkey ใช้เวลาเพียงไม่กี่วินาที:

  1. ไปที่ การตั้งค่า → ความปลอดภัย → การยืนยันตัวตนสองปัจจัย
  2. คลิก เพิ่ม Passkey
  3. ตั้งชื่ออุปกรณ์ของคุณ (เช่น “iPhone 15”)
  4. ยืนยันตัวตนด้วย Face ID / Touch ID / Windows Hello
  5. เสร็จแล้ว! Passkey ของคุณถูกลงทะเบียนแล้ว

การเข้าสู่ระบบในอนาคตต้องการเพียงการยืนยันไบโอเมตริก - ไม่ต้องพิมพ์รหัสผ่านหรือคัดลอกรหัสจากแอป authenticator

ทำไมเราเลือก Passkeys

วิธีการความเสี่ยง Phishingประสบการณ์ผู้ใช้การกู้คืน
รหัสผ่านสูงแย่ (ลืม, อ่อนแอ)รีเซ็ตอีเมล
SMS 2FAปานกลาง (SIM swap)พอใช้หมายเลขโทรศัพท์
TOTP Appsต่ำป้อนรหัสด้วยตนเองกุญแจสำรอง
Passkeysต่ำมากยอดเยี่ยมรหัสกู้คืน

Passkeys เป็นตัวแทนของอนาคตของการยืนยันตัวตน พวกมันได้รับการสนับสนุนโดยแพลตฟอร์ม Apple, Google และ Microsoft แล้ว ทำให้เข้าถึงได้สำหรับผู้ใช้เกือบทั้งหมดของเรา


พร้อมที่จะไม่ใช้รหัสผ่านแล้วหรือยัง? เปิดใช้งาน passkeys ในการตั้งค่าความปลอดภัยของคุณ!