Firebase Phone Auth: لماذا تفشل رسائل OTP بسبب الخطأ 39 وكيفية حل المشكلة؟
يواجه مطوّرون حول العالم مشكلات في خدمة المصادقة عبر الهاتف في Firebase، حيث يظهر الخطأ: An internal error has occurred. [ Error code:39 ] عند إرسال رموز التحقق إلى أرقام حقيقية، بينما تعمل الأرقام التجريبية بصورة طبيعية. في هذا المقال، نوضح المعنى الفعلي للخطأ، والأسباب التي تؤدي إلى ظهوره، والحلول التي ثبتت فعاليتها لمعالجة المشكلة.
ويتطلب ذلك تنفيذ الخطوات الآتية:
تتضمن الإعدادات المطلوبة القيم الآتية:
- phoneEnforcementState: تعيينه إلى AUDIT.
- useSmsTollFraudProtection: تعيينه إلى true.
com.google.android.recaptcha:recaptcha
الحل الثاني: استخدام مزوّد خارجي لإرسال رموز التحقق OTP
تعتمد الفكرة على إنشاء نظام تحقق خاص باستخدام Cloud Functions ومزوّد خارجي لإرسال الرسائل.
تتكون آلية العمل من مرحلتين أساسيتين:
أولًا: إنشاء رمز التحقق وإرساله
تقوم Cloud Function بإنشاء رمز تحقق لمرة واحدة (OTP)، ثم تخزّن بصمته المشفّرة (Hash) فقط، مع تحديد مدة صلاحية تبلغ خمس دقائق.
كما تفرض قيودًا أمنية تشمل:
- السماح بثلاث محاولات للتحقق.
- تحديد عدد الطلبات لكل رقم هاتف.
- تحديد عدد الطلبات لكل عنوان IP.
- منع إساءة استخدام الخدمة ومحاولات الاحتيال.
بعد ذلك، يُرسل الرمز عبر مزوّد محلي أو إقليمي لخدمات المراسلة، مع تفضيل WhatsApp كخيار أول ورسائل SMS كخيار احتياطي، إذا كان ذلك مدعومًا من المزوّد المستخدم.
قد يكون هذا الخيار أقل تكلفة وأسرع في العديد من الأسواق الناشئة، بحسب المزوّد والمنطقة.
ثانيًا: التحقق من الرمز وتسجيل الدخول
تتولى Cloud Function ثانية التحقق من الرمز الذي أدخله المستخدم.
إذا لم يكن لدى المستخدم حساب في Firebase، تنشئ الوظيفة حسابًا مرتبطًا برقم هاتفه، ثم تنشئ رمز مصادقة مخصصًا (Custom Token).
بعد ذلك، يسجّل التطبيق الدخول باستخدام:
signInWithCustomToken
وبهذه الطريقة، يمكنك الاستمرار في استخدام حسابات Firebase وقواعد أمان Firestore وبقية الخدمات المرتبطة بها، دون الحاجة إلى الاعتماد على مسار التحقق الأصلي عبر SMS.
ويجب منح حساب الخدمة الذي تستخدمه Cloud Functions الدور:
Service Account Token Creator
على حساب الخدمة نفسه، حتى يتمكن من إنشاء رموز المصادقة المخصصة.
في هذا التصميم، تبقى خدمة Firebase Phone Authentication خيارًا احتياطيًا، بدلًا من الاعتماد عليها بوصفها المسار الأساسي للتحقق.
الخلاصة
الخطأ 39 في Firebase Phone Authentication قد ينتج عن قيود إقليمية وقيود مرتبطة بشركات الاتصالات تؤثر في مسار التحقق الاحتياطي، وليس بالضرورة عن وجود مشكلة في الشيفرة البرمجية للتطبيق.
يعتمد الحل الأنسب على طريقة توزيع تطبيقك واحتياجات المستخدمين:
- إذا كان تطبيقك متاحًا عبر Google Play: يمكنك استخدام reCAPTCHA Enterprise مع إعدادات الحماية المناسبة لرسائل SMS.
- إذا كنت تحتاج إلى نظام تحقق أكثر مرونة: يمكنك بناء نظام OTP خاص باستخدام Cloud Functions ومزوّد خارجي لإرسال الرسائل، ثم استخدام Custom Tokens لتسجيل الدخول إلى Firebase.
يوفر الحل الثاني تحكمًا أكبر في مزوّد الرسائل وتكاليف الإرسال وآلية التحقق، لكنه يتطلب تنفيذًا آمنًا وإدارة دقيقة لمحاولات التحقق ومعدلات الطلبات.
إذا كنت تواجه هذه المشكلة وتحتاج إلى المساعدة في معالجتها، يمكنك التواصل معنا عبر البريد الإلكتروني:
info@cotreeiq.com
Cotree | Software Solutions