زمانی که پیامک OTP از کار میافتد: احراز هویت با تکزنگ!

در روزهای اخیر، علاوه بر قطعی اینترنت، شاهد اختلالات گستردهای در خطوط تلفن، پیامرسانها و سایر پلتفرمهای ارتباطی بودهایم. یکی از پیامدهای مستقیم این وضعیت، اختلال در ارسال پیامکهای تجاری، بهویژه پیامکهای OTP یا رمزهای یکبارمصرف است که امروزه برای احراز هویت کاربران در اکثر سرویسهای آنلاین استفاده میشود.
در ابتدای قطعی سراسری اینترنت، بسیاری از کاربران برای ورود یا ثبتنام در پلتفرم گیت با مشکل مواجه شدند و ما مجبور بودیم کدهای ورود را بهصورت دستی در اختیارشان قرار دهیم. بلافاصله به دنبال راهحلی جایگزین رفتیم و در روز دوم، یک روش مؤثر و عملی ارائه کردیم که این مشکل را به شکلی جالب برطرف کرد. این راهحل تا زمان نگارش این مقاله، یعنی دوازدهمین روز قطعی اینترنت، همچنان فعال و کارآمد است.
در همان زمان، پیشنویس این مقاله را آماده کردیم تا سایر وبسایتها و سرویسهایی که به احراز هویت وابسته هستند نیز بتوانند از این روش بهره ببرند، اما انتشار آن به دلایلی به تعویق افتاد. با وجود اینکه در حال حاضر پیامکهای OTP ظاهراً دوباره وصل شدهاند، اما در عمل برای بخش قابل توجهی از کاربران همچنان کدهای تأیید ارسال نمیشود.
بنابراین، اگر صاحب کسبوکار، اپلیکیشن یا سرویس آنلاینی هستید که برای احراز هویت کاربران از پیامک OTP یا کد یکبارمصرف استفاده میکند، میتوانید احراز هویت با «تکزنگ» را بهعنوان یک راهحل جایگزین، کمهزینه و حتی در شرایط بحرانی، تنها راهحل عملی در نظر بگیرید.
برای حل این مشکل در شرایطی که دسترسی به هیچیک از روشهای متداول احراز هویت مانند پیامک یا ایمیل وجود نداشت، از یک ایده ساده استفاده کردیم؛ ایدهای که علاوه بر پیادهسازی سریع، عملکرد قابل قبولی نیز دارد. کل فرآیند، از شکلگیری ایده تا اجرای نهایی، در کمتر از دو ساعت و بدون دسترسی به اینترنت انجام شد.
در این روش، کاربر در هر صفحهای که نیاز به تأیید شماره تلفن دارد (مانند صفحه ثبتنام یا ورود به حساب کاربری)، کافی است به شمارهای که شما مشخص کردهاید یک تکزنگ بزند. سایر مراحل بهصورت خودکار انجام میشود و این روش از نظر امنیتی نیز قابل اتکا است.

این راهکار تنها با یک سیمکارت معمولی و یک اپلیکیشن اندرویدی قابل اجرا است و روی اغلب پلتفرمها بهراحتی پیادهسازی میشود.
معماری کلی احراز هویت با تکزنگ (Missed Call)
در روش احراز هویت با تکزنگ، سرور نقش مرجع اعتبارسنجی نهایی را دارد و هیچ تصمیم امنیتی در سمت کلاینت گرفته نمیشود. اپلیکیشن اندرویدی صرفاً وظیفه جمعآوری دادههای تماس و ارسال آن به سرور را بر عهده دارد.
بهصورت خلاصه، جریان کار به شکل زیر است:
- سرور یک شماره تلفن مشخص (یا از یک مجموعه شماره) به کاربر نمایش میدهد.
- کاربر از شماره موبایل خود یک تماس کوتاه (Missed Call) با آن شماره میگیرد.
- اپلیکیشن اندرویدی تماس ورودی را تشخیص میدهد.
- اپلیکیشن، گزارش تماس را به سرور ارسال میکند.
- سرور گزارش را اعتبارسنجی کرده و شماره کاربر را «تأییدشده» میکند.
مسئولیتهای والپیپر اچ دی سمت سرور
در سمت سرور، یک متد برای دریافت گزارش تماس در نظر گرفته میشود که شامل شماره تماسگیرنده و یک توکن رمزنگاریشده برای تأمین امنیت درخواست است.
همچنین متدی دیگر وجود دارد که بررسی میکند آیا شماره تلفن کاربر تأیید (Verify) شده است یا خیر.
البته این فرآیند را میتوان به روشهای مختلفی تحلیل و پیادهسازی کرد، اما در نهایت ساختار کلی همه آنها مشابه خواهد بود.
بهعنوان نمونه، متدی با نام call-report داریم که از سمت اپلیکیشن اندرویدی فراخوانی شده و گزارش تماس را ارسال میکند:
سرور پس از دریافت این گزارش، آن را اعتبارسنجی میکند و در صورتی که کاربری با این شماره تلفن درخواست ورود ثبت کرده باشد، در متدی دیگر که توسط کلاینت (اپلیکیشن یا مرورگر) فراخوانی میشود، کد ورود به کاربر ارائه شده یا کاربر بهصورت خودکار به مرحله بعد هدایت میشود.
متد بررسی وضعیت تأیید شماره تلفن و نمونه خروجی آن میتواند به شکل زیر باشد. در این مرحله، کاربر در سمت فرانتاند میتواند با کلیک روی دکمهای مانند «بررسی تماس» یا «تماس گرفتم» وضعیت احراز هویت خود را مشاهده کند. همچنین میتوان مانند کاری که ما انجام دادیم، این بررسی را هر چند ثانیه یکبار بهصورت خودکار انجام داد تا بلافاصله پس از تأیید، کاربر وارد مرحله بعد شود.
مسئولیتهای سمت اپلیکیشن:
در این بخش به یک اپلیکیشن نیاز داریم که قابلیتهای زیر را داشته باشد:
- دریافت گزارش تماس ورودی.
- ارسال شماره تماسگیرنده به همراه توکن امنیتی به متد
call-report(ترجیحاً با متد POST). - اجرای مداوم در پسزمینه و انتظار برای تماسهای بعدی، بدون بسته شدن اپلیکیشن.
پیادهسازی اپلیکیشن اختصاصی:
پیادهسازی یک اپلیکیشن برای انجام این وظایف پیچیدگی زیادی ندارد و با چند خط کد جاوا یا کاتلین قابل انجام است. ما در این پروژه از یک راهحل جایگزین استفاده کردیم، اما در صورت نیاز به توسعه اپلیکیشن اختصاصی، میتوانید از الگوهای زیر برای راهنمایی استفاده کنید:

- مجوزهای موردنیاز (AndroidManifest.xml)
- دریافت تماس ورودی (BroadcastReceiver)
- Foreground Service (اجرای دائمی)
- ارسال شماره تماس با POST + توکن امنیتی
- درخواست Runtime Permission (ضروری)
در Activity اصلی:
این کدها صرفاً جهت نمونه و درک بهتر موضوع ارائه شدهاند و برای پیادهسازی عملی این اپلیکیشن، حتماً از یک فرد متخصص کمک بگیرید.
راهحل پیشنهادی: استفاده از اپلیکیشن Automate
اپلیکیشن Automate یک ابزار بسیار کاربردی است که به کمک آن میتوانید بدون نیاز به کدنویسی، فرآیندهای مختلف را بهصورت خودکار اجرا کنید.
این اپلیکیشن از طریق گوگلپلی قابل دریافت است و در شرایط قطعی اینترنت نیز توانستیم آن را از منابع داخلی دانلود کنیم.
کار با این اپلیکیشن نسبتاً ساده است. پس از نصب، دسترسیهای مورد نیاز را به آن بدهید و سپس یک Workflow جدید ایجاد کنید و تنظیمات آن را بهگونهای انجام دهید که به تماسهای ورودی دسترسی داشته باشد.