ارسال کد تأیید پیامکی (OTP) از سایت و اپلیکیشن؛ راهنمای کامل پیاده‌سازی

ارسال کد تأیید پیامکی (OTP) از سایت و اپلیکیشن؛ راهنمای کامل پیاده‌سازی

تیم وب‌سرویس برنامه‌نویسان

ورود با شمارهٔ موبایل حالا برای کاربران ایرانی از ورود با ایمیل و رمز عبور آشناتر است. پشت این تجربهٔ ساده یک «رمز یک‌بارمصرف» (OTP) است که با پیامک می‌رسد. ساختن نسخهٔ ابتدایی آن ساده است؛ ساختن نسخه‌ای که امن، سریع و ارزان باشد چند نکته دارد که در این مقاله مرورشان می‌کنیم.

OTP چطور کار می‌کند؟

  1. کاربر شماره‌اش را وارد می‌کند.
  2. سرور شما یک عدد تصادفی می‌سازد، آن را (به‌شکل امن) با زمان انقضا ذخیره می‌کند و با وب‌سرویس پیامک می‌فرستد.
  3. کاربر عدد را وارد می‌کند؛ سرور مقایسه می‌کند، و اگر درست و منقضی‌نشده بود، کاربر را وارد می‌کند و کد را باطل می‌کند.

نکتهٔ کلیدی: کد را سرور شما می‌سازد و بررسی می‌کند، نه سامانهٔ پیامکی. وب‌سرویس فقط پیام را می‌رساند.

طراحی کد: چند رقم و چند دقیقه؟

  • طول: ۵ یا ۶ رقم تعادل خوبی میان امنیت و راحتی است. کد ۴ رقمی فقط ده هزار حالت دارد و بدون محدودیت تلاش، حدس‌زدنی است.
  • تصادفی واقعی: از مولد امن زبان‌تان استفاده کنید (random_int در PHP، ماژول secrets در پایتون)، نه توابع تصادفی معمولی.
  • اعتبار: ۲ تا ۵ دقیقه معمول است. کوتاه‌تر کاربر را اذیت می‌کند و بلندتر خطر سوءاستفاده را بالا می‌برد.
  • یک‌بارمصرف: پس از یک ورود موفق، یا پس از چند تلاش ناموفق (مثلاً ۵ بار)، کد باطل شود.

متن پیام را کوتاه و روشن بنویسید

کوتاهی هم سرعت را بالا می‌برد و هم هزینه را پایین نگه می‌دارد: پیامک فارسی تا ۷۰ نویسه یک بخش حساب می‌شود و بیشتر از آن چندبخشی می‌شود. نمونه:

کد ورود شما به فروشگاه نمونه: 48213
این کد را به کسی ندهید.

در درگاه پیامک (SMSGate)، درخواستی که یک گیرنده و متن تا ۶۴ نویسه دارد خودکار از نوع «کد تأیید» شناخته می‌شود. نام سایت یا برندتان را در متن بیاورید تا کاربر بداند کد از کجا آمده و کلاهبرداری‌های «کدت را برایم بفرست» کمتر جواب بدهد.

از چه خطی بفرستیم؟

برای کد تأیید از خط خدماتی استفاده کنید. خط تبلیغاتی به شماره‌هایی که دریافت پیامک تبلیغاتی را مسدود کرده‌اند (بلک‌لیست) نمی‌رسد، و بخش بزرگی از کاربران چنین‌اند؛ یعنی بخشی از کاربران شما هرگز کد را نمی‌گیرند. خط اختصاصی را می‌شود خدماتی کرد؛ تا تأیید اپراتور هم می‌توانید از خط اشتراکی خدماتی استفاده کنید.

امنیت: چهار سدی که حتماً لازم است

  1. محدودیت درخواست کد: برای هر شماره و هر IP سقف بگذارید (مثلاً یک کد در هر دقیقه و چند کد در ساعت). بدون این سد، کسی می‌تواند با یک اسکریپت هزاران پیامک به هزینهٔ شما بفرستد یا شماره‌ای را بمباران کند.
  2. محدودیت تلاش: پس از چند ورود اشتباه، کد را باطل کنید.
  3. ذخیرهٔ امن: خود کد را خام در پایگاه داده نگه ندارید؛ هش آن را با زمان انقضا ذخیره کنید.
  4. کلید API فقط روی سرور: ارسال کد هرگز نباید مستقیم از اپلیکیشن موبایل یا جاوااسکریپت مرورگر انجام شود؛ کلیدی که داخل اپ باشد، استخراج‌شدنی است.

چرا کد تأیید نمی‌رسد یا دیر می‌رسد؟

  • خط تبلیغاتی و بلک‌لیست: رایج‌ترین علت؛ راه‌حل، خط خدماتی است.
  • شمارهٔ نادرست: رقم فارسی، فاصلهٔ اضافه یا پیشوند اشتباه. شماره را پیش از ارسال یکدست کنید.
  • موجودی تمام شده: پاسخ وب‌سرویس خطای موجودی ناکافی می‌دهد (در درگاه پیامک کد ۱۶۴). برای موجودی هشدار بگذارید تا ورود کاربران یک‌باره قطع نشود.
  • گوشی کاربر: حافظهٔ پر، خاموش بودن یا خارج از دسترس بودن؛ کاری از سمت شما برنمی‌آید، جز دکمهٔ «ارسال دوباره» پس از چند ثانیه.

برای این‌که بدانید دقیقاً چه شده، وضعیت تحویل را پیگیری کنید: شناسهٔ پیگیری هر ارسال را نگه دارید و وضعیت نهایی را استعلام کنید یا با وب‌هوک تحویل بگیرید.

تجربهٔ کاربری بهتر

  • دکمهٔ «ارسال دوباره» را با شمارش معکوس نشان دهید (مثلاً ۶۰ ثانیه) تا کاربر پشت‌سرهم درخواست ندهد.
  • در فرم وارد کردن کد، ویژگی autocomplete="one-time-code" را بگذارید تا گوشی‌های امروزی کد را از پیامک پیشنهاد کنند.
  • بعد از ارسال، شماره را با چند رقم پنهان نشان دهید و راه «ویرایش شماره» بگذارید.

جمع‌بندی

یک OTP خوب یعنی کد تصادفی کوتاه با عمر کوتاه، خط خدماتی، محدودیت درخواست و تلاش، و کلید API امن روی سرور. نمونه‌کد ارسال را در «اتصال سایت و نرم‌افزار به وب‌سرویس پیامک» آورده‌ایم. برای فعال‌سازی خط خدماتی، با پشتیبانی وب‌سرویس در تماس باشید.