كلمات المرور هي الحلقة الأضعف في أمان الحسابات. يمكن اختراقها عبر التصيد الاحتيالي، أو تسريبها، أو إعادة استخدامها، أو نسيانها. لهذا السبب أضفنا دعم WebAuthn Passkeys - وهي طريقة مصادقة بدون كلمة مرور مقاومة للتصيد الاحتيالي وأكثر أماناً وراحة في الوقت نفسه.

ما هي Passkeys؟

Passkeys هي بيانات اعتماد مشفرة مخزنة على جهازك (الهاتف، الكمبيوتر المحمول، مفتاح الأمان) تستبدل كلمات المرور للمصادقة. تستخدم معيار WebAuthn (جزء من FIDO2) وتوفر عدة مزايا:

  • مقاومة للتصيد الاحتيالي - Passkeys مرتبطة بنطاق الموقع، لذا لا يمكن استخدامها على المواقع المزيفة
  • لا توجد أسرار للتسريب - يتم تخزين المفتاح العام فقط على الخادم
  • مرتبطة بالجهاز - المفتاح الخاص لا يغادر جهازك أبداً
  • محمية بيومترياً - عادة ما تكون محمية بـ Face ID أو Touch ID أو Windows Hello
  • مزامنة عبر الأجهزة - المنصات الحديثة تزامن Passkeys عبر الأجهزة من خلال حسابات iCloud أو Google أو Microsoft

تنفيذنا

قمنا بدمج دعم WebAuthn Passkeys في منظومة المصادقة الحالية django-allauth، مع توفير نقاط نهاية API للويب والهاتف المحمول.

تدفق التسجيل

عندما يسجل المستخدم Passkey جديد، يعمل التدفق كالتالي:

  1. يطلب العميل خيارات التسجيل من الخادم
  2. يولد الخادم تحدياً مع معلومات المستخدم والطرف المعتمد
  3. واجهة WebAuthn API في المتصفح تطلب من المستخدم (البيومترية أو مفتاح الأمان)
  4. يرسل العميل بيانات الاعتماد إلى الخادم
  5. يتحقق الخادم ويخزن المفتاح العام
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
# API endpoint to begin registration
class WebAuthnRegistrationOptionsView(APIView):
    permission_classes = [IsAuthenticated]

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

        # Generate credential creation options
        creation_options = webauthn_auth.begin_registration(
            request.user,
            passwordless=False  # Use as 2FA, not passwordless
        )

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

تدفق المصادقة

للمصادقة الثنائية باستخدام Passkey:

  1. يكمل المستخدم المصادقة الأولية (اسم المستخدم/كلمة المرور أو تسجيل الدخول الاجتماعي)
  2. يعيد الخادم تحدياً للتحقق من WebAuthn
  3. يطلب المتصفح Passkey (لمسة بيومترية)
  4. يتم التحقق من بيانات الاعتماد مقابل المفتاح العام المخزن
  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")

        # Complete authentication and verify credential
        authenticator = webauthn_auth.complete_authentication(
            request.user,
            credential
        )

        # Record usage for security monitoring
        authenticator.last_used_at = timezone.now()
        authenticator.save()

        return Response({"success": True})

إدارة Passkeys

يمكن للمستخدمين إدارة Passkeys المسجلة لديهم:

  • عرض جميع Passkeys مع تاريخ التسجيل وآخر استخدام
  • إعادة تسمية Passkeys لتسهيل التعرف عليها (مثل “iPhone”، “MacBook”)
  • حذف Passkeys (مع الحماية من إزالة آخر مصادق)
 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

توفر واجهة REST API الخاصة بنا دعماً كاملاً لـ WebAuthn لتطبيق الهاتف المحمول:

نقطة النهايةالطريقةالوصف
/api/webauthn/register/options/GETالحصول على تحدي التسجيل
/api/webauthn/register/complete/POSTإكمال التسجيل
/api/webauthn/authenticate/options/GETالحصول على تحدي المصادقة
/api/webauthn/verify/POSTالتحقق من بيانات الاعتماد لـ 2FA
/api/webauthn/GETعرض Passkeys المسجلة
/api/webauthn/<id>/PATCHإعادة تسمية Passkey
/api/webauthn/<id>/DELETEحذف Passkey

اعتبارات الأمان

رموز الاسترداد

عندما يسجل المستخدم أول مصادق له (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": "Cannot delete - you must have at least one authentication method"
    }, status=400)

المراقبة

نتتبع استخدام Passkeys عبر مقاييس Datadog لمراقبة الأمان:

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

دعم المتصفحات

WebAuthn مدعوم في جميع المتصفحات الحديثة:

  • Chrome 67+
  • Firefox 60+
  • Safari 13+
  • Edge 79+
  • Chrome للهاتف المحمول، Safari، Firefox

للمتصفحات الأقدم، يمكن للمستخدمين الاستمرار في استخدام TOTP (تطبيقات المصادقة) أو رموز الاسترداد.

تجربة المستخدم

إضافة Passkey تستغرق ثوانٍ فقط:

  1. اذهب إلى الإعدادات → الأمان → المصادقة الثنائية
  2. انقر على إضافة Passkey
  3. سمِّ جهازك (مثل “iPhone 15”)
  4. قم بالمصادقة باستخدام Face ID / Touch ID / Windows Hello
  5. تم! تم تسجيل Passkey الخاص بك

تسجيلات الدخول المستقبلية تتطلب فقط تأكيداً بيومترياً - لا حاجة لكتابة كلمات المرور أو نسخ الرموز من تطبيقات المصادقة.

لماذا اخترنا Passkeys

الطريقةخطر التصيدتجربة المستخدمالاسترداد
كلمات المرورعاليسيئة (منسية، ضعيفة)إعادة تعيين بالبريد الإلكتروني
SMS 2FAمتوسط (تبديل SIM)مقبولةرقم الهاتف
تطبيقات TOTPمنخفضإدخال الرمز يدوياًمفاتيح احتياطية
Passkeysمنخفض جداًممتازةرموز الاسترداد

تمثل Passkeys مستقبل المصادقة. إنها مدعومة بالفعل من منصات Apple و Google و Microsoft، مما يجعلها متاحة لجميع مستخدمينا تقريباً.


هل أنت مستعد للتخلص من كلمات المرور؟ فعّل Passkeys في إعدادات الأمان الخاصة بك!