قد تصلك رسالة SMS التي تحتوي رمزًا لمرة واحدة، ثم تلاحظ أن تطبيقًا على الهاتف لا يستطيع قراءتها أو التقاط الرمز تلقائيًا، بينما تطبيق آخر يملأه فورًا. هذا السلوك ليس خللًا بالضرورة؛ فقد يخفي Android رموز التحقق OTP أو يقيّد وصول بعض التطبيقات إليها لحماية الرموز من التطبيقات التي لا يفترض أن تقرأها. الفكرة الأساسية هي أن وجود إذن للوصول إلى الرسائل لا يعني دائمًا أن كل تطبيق يجب أن يحصل فورًا على كل رمز تحقق يصل إلى الجهاز.
تتعامل الإصدارات الحديثة من Android مع رسائل التحقق بوصفها بيانات أمنية حساسة، وتدفع المطورين إلى استخدام آليات مخصصة مثل SMS Retriever وSMS User Consent بدل طلب الوصول الواسع إلى صندوق الرسائل.
الفكرة باختصار
الفكرة باختصار
- Android قد يمنع تطبيقًا غير مقصود من قراءة بعض رسائل OTP فور وصولها حتى لو امتلك صلاحية تتعلق بالرسائل.
- التطبيق الذي يحتاج رمزًا للتحقق لا يفترض أن يقرأ جميع رسائلك؛ توجد واجهات مخصصة للحصول على رمز مرتبط به فقط.
- SMS Retriever يسمح للتطبيق باستقبال رمز مصمم له دون طلب صلاحية
READ_SMSأوRECEIVE_SMS. - SMS User Consent يسمح للتطبيق بطلب موافقتك على قراءة رسالة تحقق واحدة بدل الوصول العام إلى الرسائل.
- في Android 17 توسعت حماية بعض رسائل OTP بحيث يمكن تأخير وصولها برمجيًا إلى التطبيقات غير المقصودة.
- عدم ظهور الرمز تلقائيًا داخل تطبيق لا يعني أن الرسالة نفسها اختفت من تطبيق الرسائل الافتراضي.
لماذا لا يسمح Android لكل تطبيق بقراءة رمز OTP؟
رمز OTP، أو One-Time Password، هو رمز يستخدم مرة واحدة لإثبات امتلاك المستخدم لرقم الهاتف أو لإكمال تسجيل الدخول أو عملية حساسة. إذا تمكن أي تطبيق يمتلك وصولًا واسعًا إلى الرسائل من التقاط هذه الرموز بلا قيود، فقد يصبح ذلك وسيلة للاستيلاء على الحسابات أو تجاوز خطوة التحقق.
لهذا توصي وثائق Android الخاصة بتقليل طلبات الصلاحيات بعدم طلب صلاحية READ_SMS عندما يمكن تنفيذ التحقق من خلال SMS Retriever، وتذكر SMS User Consent كخيار عندما لا يتحكم التطبيق في صيغة رسالة التحقق.
المبدأ هنا واضح: يجب أن يحصل التطبيق على أقل قدر من الوصول الذي يحتاجه. تطبيق مصرفي يحتاج رمز تحقق خاصًا بعملية تسجيل دخول لا يحتاج بالضرورة إلى الاطلاع على جميع رسائل SMS الموجودة على الهاتف.
كيف يعرف Android أن الرمز مخصص لتطبيق معين؟
إحدى الطرق الرسمية هي SMS Retriever API. تعتمد هذه الآلية على رسالة تحقق مصممة بطريقة يستطيع Google Play services ربطها بالتطبيق الذي طلب التحقق. يبدأ التطبيق الاستماع لرسالة التحقق، وبعد وصول الرسالة ترسل الخدمة محتواها إلى التطبيق المقصود دون منحه صلاحية عامة لقراءة صندوق الرسائل.
توضح وثائق SMS Retriever الرسمية أن التطبيق يبدأ الاستماع إلى رسالة تحتوي رمزًا لمرة واحدة، ثم يستقبل الرسالة المناسبة ويعيد الرمز إلى الخادم للتحقق. كما تؤكد الوثائق أن هذه الطريقة لا تتطلب من التطبيق صلاحيات قراءة SMS التقليدية.
ويحتوي تنسيق SMS Retriever على قيمة تعريف مرتبطة بالتطبيق. لذلك يستطيع النظام التمييز بين تطبيق ينتظر رسالة صممت له وبين تطبيق آخر يحاول فحص الرسائل بشكل عام.
ما الذي تغير مع حماية OTP في Android 17؟
توسّع Android 17 في حماية رسائل التحقق. ووفق وثائق تغييرات Android 17 الرسمية، تُطبّق حماية إضافية على رسائل SMS التي تتضمن رموزًا لمرة واحدة، بما في ذلك بعض الرسائل المهيأة لتنسيق WebOTP.
إذا كان تطبيق يستطيع تقنيًا قراءة SMS لكنه ليس الجهة المقصودة من رسالة التحقق، فقد لا تصبح الرسالة متاحة له برمجيًا فور وصولها. وتوضح الوثائق أن الوصول إلى بعض هذه الرسائل يمكن أن يتأخر لمدة تصل إلى ثلاث ساعات للتطبيقات غير المستثناة، بينما يظل التطبيق المقصود أو بعض التطبيقات ذات الأدوار الخاصة قادرًا على التعامل معها وفق القواعد المطبقة.
وفي بعض رسائل SMS Retriever، كانت آلية التأخير موجودة قبل Android 17 أيضًا. وتشير واجهة Telephony.Sms الرسمية إلى أن الرسائل التي تحتوي على بصمة SMS Retriever يمكن تأخير إتاحتها لبعض التطبيقات، مع استثناءات مثل تطبيق الرسائل الافتراضي وبعض الأدوار النظامية.
لماذا يستطيع تطبيق الرسائل رؤية الرمز بينما لا يراه تطبيق آخر؟
تطبيق الرسائل الافتراضي يؤدي وظيفة مختلفة عن تطبيق عادي. وظيفته الأساسية هي إدارة رسائل SMS نفسها، ولذلك يخضع لمسار صلاحيات ودور نظامي مختلف. أما تطبيق متجر أو خدمة توصيل أو منصة مالية، فليس من الطبيعي أن يحتاج إلى الاطلاع على كل محادثات SMS حتى يحصل على رمز واحد.
وتوضح وثائق Android الخاصة بالتطبيقات الافتراضية أن التطبيق يجب أن يصبح معالج SMS الافتراضي قبل طلب بعض الصلاحيات المرتبطة بهذا الدور. لذلك لا يمكن مقارنة تطبيق الرسائل الافتراضي بتطبيق عادي يستخدم SMS فقط للتحقق.
- تطبيق الرسائل الافتراضي: وظيفته إدارة الرسائل على الجهاز.
- تطبيق يستخدم SMS Retriever: يحصل على رسالة تحقق موجهة إليه دون قراءة جميع الرسائل.
- تطبيق يستخدم SMS User Consent: يطلب منك السماح بقراءة رسالة محددة.
- تطبيق يحاول قراءة SMS مباشرة: يخضع لصلاحيات وسياسات وقيود أكبر.
كيف يستلم التطبيق الرمز دون قراءة رسائلك كلها؟
يوفر Android أكثر من مسار، ويعتمد الاختيار على طريقة إرسال الرمز وتصميم الخدمة.
SMS Retriever
هو المسار الأنسب عندما تستطيع الخدمة التحكم في صيغة رسالة OTP. يستطيع التطبيق انتظار رسالة مرتبطة به ثم استخراج الرمز دون طلب صلاحية قراءة كل الرسائل. وتذكر إرشادات Android للمصادقة الآمنة أن SMS Retriever لا يتطلب صلاحيات مثل READ_SMS أو RECEIVE_SMS.
SMS User Consent
إذا لم يكن التطبيق يتحكم في شكل الرسالة، يمكن استخدام مسار يعتمد على موافقة المستخدم. يظهر طلب يسمح للتطبيق بالوصول إلى رسالة تحقق محددة بدل فتح صندوق SMS بالكامل له.
خدمة التعبئة التلقائية
يمكن لبعض خدمات Autofill المساعدة في اقتراح رموز SMS في حقول التحقق. لكن ذلك أيضًا يخضع لشروط وموافقة المستخدم. وتوضح وثائق Android لخدمات Autofill أن خدمة التعبئة يمكنها التعامل مع رموز SMS وفق آلية مخصصة وبعد منح الموافقة المطلوبة.
متى يكون عدم التعبئة التلقائية طبيعيًا؟
إذا وصل الرمز إلى تطبيق الرسائل لكنه لم يظهر في التطبيق الذي طلبه، فلا يعني ذلك مباشرة وجود مشكلة في الهاتف. قد يكون السبب أن التطبيق لا يستخدم واجهة الاسترداد الصحيحة، أو أن صيغة SMS لا تطابق الشكل المتوقع، أو أن التطبيق يعتمد على موافقة لم تُمنح.
وقد توجد حالات أخرى مثل:
- الرمز أُرسل من خدمة مختلفة عن الخدمة التي ينتظرها التطبيق.
- رسالة التحقق لا تحتوي المعلومات اللازمة لربطها بالتطبيق.
- التطبيق لا يستخدم SMS Retriever ولا يملك مسارًا آخر للتعبئة.
- خدمة Autofill غير مفعلة أو لم تحصل على إذن التعامل مع رمز OTP.
- انتهت مهلة انتظار الرمز داخل التطبيق قبل وصول الرسالة.
- التطبيق قديم ولا يتعامل جيدًا مع قيود الخصوصية الجديدة في Android.
في هذه الحالات تستطيع غالبًا فتح تطبيق الرسائل وكتابة الرمز يدويًا. المشكلة تكون في القراءة الآلية، وليس بالضرورة في وصول SMS نفسها.
هل يمكن منح التطبيق صلاحية SMS لحل المشكلة؟
ليس من الأفضل البحث عن صلاحية واسعة كحل أول. فالصلاحية لا تضمن بالضرورة تجاوز كل آليات حماية OTP الحديثة، كما أن منح تطبيق وصولًا كاملًا إلى الرسائل يوسّع كمية البيانات التي يستطيع الاطلاع عليها.
وتشير وثائق Android إلى أن صلاحيات الرسائل تُعامل باعتبارها وصولًا إلى بيانات شخصية حساسة، كما أن Google Play يفرض قيودًا على استخدام مجموعات صلاحيات SMS في التطبيقات المنشورة. لذلك ينبغي أن يعتمد التطبيق الجيد على الواجهات المخصصة للتحقق بدل إجبار المستخدم على منح وصول عام إلى الرسائل.
إذا وصل OTP إلى تطبيق الرسائل لكن تطبيق الخدمة لم يقرأه تلقائيًا، فالكتابة اليدوية أكثر أمانًا من منح تطبيق غير موثوق وصولًا واسعًا إلى جميع رسائلك.
ماذا تفعل عندما لا يظهر رمز OTP داخل التطبيق؟
- افتح تطبيق الرسائل وتأكد من وصول رسالة التحقق أصلًا.
- إذا كان الرمز ظاهرًا، أدخله يدويًا بدل تعديل صلاحيات غير ضرورية.
- حدّث التطبيق الذي طلب الرمز من متجر التطبيقات الرسمي.
- تحقق من أن خدمة التعبئة التلقائية المطلوبة مفعلة إذا كان التطبيق يعتمد عليها.
- إذا ظهر طلب موافقة لقراءة رسالة تحقق واحدة، راجع اسم التطبيق والرسالة قبل الموافقة.
- تجنب تثبيت تطبيقات أو أدوات تطلب الوصول الكامل إلى SMS فقط لنسخ رموز التحقق.
إذا كانت المشكلة تحدث في تطبيق واحد فقط بينما تعمل رموز التحقق بصورة طبيعية في بقية التطبيقات، فالأرجح أن طريقة تنفيذ التحقق داخل ذلك التطبيق هي التي تحتاج تحديثًا أو إصلاحًا، وليس نظام الرسائل في الهاتف كله.
خلاصة عملية قبل تغيير أي إعداد
خلاصة عملية
- وجود الرمز في تطبيق الرسائل وعدم ظهوره تلقائيًا داخل تطبيق آخر قد يكون سلوك حماية طبيعيًا.
- لا تمنح تطبيقًا صلاحية قراءة جميع SMS لمجرد أن التعبئة التلقائية لم تعمل.
- تطبيقات Android الحديثة تستطيع استخدام طرق مخصصة لاستقبال OTP دون الوصول العام إلى الرسائل.
- القيود الأحدث تستهدف تقليل قدرة التطبيقات غير المقصودة على اعتراض رموز التحقق.
- عند الشك، أدخل الرمز يدويًا وتحقق من تحديث التطبيق قبل تغيير إعدادات الأمان.
خطوتك التالية هي التحقق مما إذا كانت رسالة OTP موجودة داخل تطبيق الرسائل؛ فإذا كانت موجودة، أدخلها يدويًا أولًا ثم حدّث التطبيق بدل منحه صلاحيات إضافية لا يحتاجها.
قد يهمك:
- كيف تعرف إذا كان هاتف Android يستخدم حماية السرقة الجديدة؟
- ماذا يحدث عند تفعيل وضع الفقد في Android 17؟
- لماذا يرفض Android صلاحية إمكانية الوصول بعد التحديث؟
- كيف تعرف هل Gemini يعمل على الجهاز أم في السحابة؟
أسئلة شائعة
هل إخفاء OTP يعني أن الرسالة حُذفت من الهاتف؟
لا. قد تكون الرسالة موجودة بصورة طبيعية في تطبيق SMS بينما يمنع Android تطبيقًا آخر من قراءتها برمجيًا أو يؤخر وصوله إليها.
هل يحتاج التطبيق إلى صلاحية قراءة SMS لتعبئة رمز التحقق تلقائيًا؟
ليس بالضرورة. يمكن للتطبيق استخدام SMS Retriever للحصول على رمز موجه إليه دون طلب صلاحية قراءة جميع رسائل SMS.
لماذا يقرأ تطبيق رمز OTP بينما لا يستطيع تطبيق آخر ذلك؟
تختلف طريقة تنفيذ التحقق ودور كل تطبيق وصلاحياته. وقد يكون أحد التطبيقات هو المستلم المقصود للرسالة أو يستخدم واجهة تحقق مخصصة، بينما لا تتوفر الشروط نفسها للتطبيق الآخر.
هل كتابة رمز OTP يدويًا تعني وجود مشكلة في Android؟
لا. الإدخال اليدوي مسار طبيعي عندما لا يستطيع التطبيق استخدام التعبئة أو الاسترداد التلقائي، ما دام الرمز وصل إلى رقم الهاتف بصورة صحيحة.
هل يمكن لتطبيق غير موثوق سرقة رمز التحقق من SMS؟
يحاول Android تقليل هذا الخطر باستخدام قيود الصلاحيات وآليات حماية OTP، لكن يظل من المهم عدم منح التطبيقات غير الموثوقة وصولًا غير ضروري إلى الرسائل أو خدمات إمكانية الوصول.


