Watch
1
0
Fork
You've already forked Seyyed_arc
0
forked from hesabix/arc
Seyyed_arc/docs/REGISTRATION_UNVERIFIED_ISSUES.md
2026-04-14 19:34:55 +03:30

12 KiB
Executable file

مشکلات احتمالی ثبت‌نام با شماره موبایل/ایمیل تایید نشده

سناریو مشکل

کاربر 1: با شماره موبایل x یا ایمیل y ثبت‌نام می‌کند اما آن را تایید نمی‌کند.

کاربر 2: مالک واقعی شماره x یا ایمیل y می‌خواهد ثبت‌نام کند.

مشکلات شناسایی شده

1. مشکل در بکند - تابع register_user

فایل: hesabixAPI/app/services/auth_service.py (خطوط 88-92)

repo = UserRepository(db)
if email_n and repo.get_by_email(email_n):
    raise ApiError("EMAIL_IN_USE", "Email is already in use")
if mobile_n and repo.get_by_mobile(mobile_n):
    raise ApiError("MOBILE_IN_USE", "Mobile is already in use")

مشکل:

  • بررسی می‌کند که آیا ایمیل/موبایل قبلاً استفاده شده است
  • اما بررسی نمی‌کند که آیا تایید شده است یا نه
  • اگر کاربر 1 با شماره x ثبت‌نام کند و تایید نکند، کاربر 2 (مالک واقعی) نمی‌تواند ثبت‌نام کند

نتیجه: کاربر 2 با خطای MOBILE_IN_USE یا EMAIL_IN_USE مواجه می‌شود و نمی‌تواند ثبت‌نام کند.


2. مشکل در فرانت - مدیریت خطا

فایل: hesabixUI/hesabix_ui/lib/pages/login_page.dart (خطوط 708-714)

مشکل:

  • خطاهای EMAIL_IN_USE و MOBILE_IN_USE را دریافت می‌کند
  • اما پیام واضحی به کاربر نمی‌دهد که آیا شماره/ایمیل تایید شده است یا نه
  • کاربر نمی‌داند که آیا می‌تواند با این شماره/ایمیل ثبت‌نام کند یا نه

نتیجه: تجربه کاربری ضعیف - کاربر نمی‌داند چه کاری باید انجام دهد.


3. مشکل در فرآیند تایید

فایل: hesabixAPI/app/services/mobile_verification_service.py

مشکل:

  • اگر کاربر 1 با شماره x ثبت‌نام کند اما تایید نکند
  • کاربر 1 می‌تواند با رمز عبور خود وارد شود
  • اما نمی‌تواند شماره را تایید کند (چون مالک واقعی نیست)
  • کاربر 2 (مالک واقعی) نمی‌تواند شماره خود را بازیابی کند

نتیجه: هر دو کاربر در وضعیت بن‌بست قرار می‌گیرند.


4. مشکل در بازیابی رمز عبور

فایل: hesabixAPI/app/services/auth_service.py (تابع create_password_reset)

مشکل:

  • اگر کاربر 1 با شماره x ثبت‌نام کند اما تایید نکند
  • کاربر 2 (مالک واقعی) نمی‌تواند با شماره x رمز عبور بازیابی کند
  • چون شماره به کاربر 1 اختصاص داده شده است

نتیجه: کاربر 2 نمی‌تواند به حساب کاربری خود دسترسی پیدا کند.


5. مشکل در ورود با OTP

فایل: hesabixAPI/app/services/otp_login_service.py

مشکل:

  • اگر کاربر 1 با شماره x ثبت‌نام کند اما تایید نکند
  • کاربر 2 (مالک واقعی) نمی‌تواند با شماره x و OTP وارد شود
  • چون شماره به کاربر 1 اختصاص داده شده است

نتیجه: کاربر 2 نمی‌تواند به سیستم دسترسی پیدا کند.


مشکلات جانبی

6. مشکل در تغییر شماره/ایمیل

فایل: hesabixAPI/app/services/auth_service.py (تابع update_user_mobile و update_user_email)

مشکل:

  • اگر کاربر 1 با شماره x ثبت‌نام کند اما تایید نکند
  • کاربر 1 می‌تواند شماره را تغییر دهد
  • اما اگر کاربر 2 بخواهد همان شماره را استفاده کند، با خطا مواجه می‌شود

نتیجه: کاربر 2 نمی‌تواند از شماره خود استفاده کند.


7. مشکل در داده‌های تکراری

مشکل:

  • اگر کاربر 1 با شماره x ثبت‌نام کند اما تایید نکند
  • و بعد کاربر 2 با همان شماره ثبت‌نام کند (اگر مشکل 1 حل شود)
  • ممکن است داده‌های تکراری در سیستم ایجاد شود

نتیجه: مشکلات یکپارچگی داده‌ها.


راهکارهای پیشنهادی

راهکار 1: بررسی وضعیت تایید در ثبت‌نام

تغییر در بکند:

  • در تابع register_user، قبل از خطای EMAIL_IN_USE یا MOBILE_IN_USE، بررسی کنیم که آیا شماره/ایمیل تایید شده است یا نه
  • اگر تایید نشده باشد، به کاربر اجازه دهیم که ثبت‌نام کند (با حذف کاربر قبلی یا جایگزینی)

مثال:

repo = UserRepository(db)
existing_user_email = repo.get_by_email(email_n) if email_n else None
existing_user_mobile = repo.get_by_mobile(mobile_n) if mobile_n else None

# بررسی ایمیل
if email_n and existing_user_email:
    if getattr(existing_user_email, "email_verified", False):
        raise ApiError("EMAIL_IN_USE", "Email is already in use")
    else:
        # ایمیل ثبت شده اما تایید نشده - حذف کاربر قبلی یا جایگزینی
        # TODO: تصمیم‌گیری در مورد استراتژی

# بررسی موبایل
if mobile_n and existing_user_mobile:
    if getattr(existing_user_mobile, "mobile_verified", False):
        raise ApiError("MOBILE_IN_USE", "Mobile is already in use")
    else:
        # موبایل ثبت شده اما تایید نشده - حذف کاربر قبلی یا جایگزینی
        # TODO: تصمیم‌گیری در مورد استراتژی

راهکار 2: بهبود پیام‌های خطا

تغییر در بکند:

  • خطاهای جدید ایجاد کنیم:
    • EMAIL_IN_USE_VERIFIED: ایمیل قبلاً ثبت و تایید شده است
    • EMAIL_IN_USE_UNVERIFIED: ایمیل قبلاً ثبت شده اما تایید نشده است
    • MOBILE_IN_USE_VERIFIED: موبایل قبلاً ثبت و تایید شده است
    • MOBILE_IN_USE_UNVERIFIED: موبایل قبلاً ثبت شده اما تایید نشده است

تغییر در فرانت:

  • پیام‌های مناسب برای هر نوع خطا نمایش دهیم
  • برای خطاهای UNVERIFIED، به کاربر گزینه‌ای بدهیم که آیا می‌خواهد ادامه دهد یا نه

راهکار 3: حذف خودکار کاربران تایید نشده

استراتژی:

  • اگر کاربری با شماره/ایمیل ثبت‌نام کند اما در مدت زمان مشخصی (مثلاً 24 ساعت) تایید نکند، حساب کاربری را حذف کنیم
  • یا اگر کاربر جدیدی با همان شماره/ایمیل ثبت‌نام کند، کاربر قبلی را حذف کنیم

مزایا:

  • جلوگیری از انباشت کاربران تایید نشده
  • آزاد شدن شماره/ایمیل برای کاربران واقعی

معایب:

  • ممکن است کاربر واقعی در زمان تایید مشکل داشته باشد

راهکار 4: جایگزینی کاربر قبلی

استراتژی:

  • اگر کاربر جدیدی با شماره/ایمیل تایید نشده ثبت‌نام کند، کاربر قبلی را حذف کنیم و کاربر جدید را ایجاد کنیم

مزایا:

  • کاربر واقعی می‌تواند ثبت‌نام کند
  • جلوگیری از انباشت کاربران تایید نشده

معایب:

  • ممکن است کاربر قبلی داده‌هایی داشته باشد که از دست برود

راهکار 5: محدودیت زمانی برای تایید

استراتژی:

  • به کاربران تایید نشده یک محدودیت زمانی (مثلاً 24 ساعت) بدهیم
  • بعد از این زمان، حساب کاربری غیرفعال شود
  • کاربر جدید می‌تواند با همان شماره/ایمیل ثبت‌نام کند

مزایا:

  • تعادل بین امنیت و راحتی کاربر
  • جلوگیری از انباشت کاربران تایید نشده

راهکار 6: تایید قبل از ثبت‌نام کامل

استراتژی:

  • قبل از ایجاد حساب کاربری، شماره/ایمیل را تایید کنیم
  • فقط بعد از تایید، حساب کاربری ایجاد شود

مزایا:

  • جلوگیری از مشکل از ابتدا
  • اطمینان از اینکه فقط کاربران واقعی ثبت‌نام می‌کنند

معایب:

  • فرآیند ثبت‌نام طولانی‌تر می‌شود
  • نیاز به تغییرات زیاد در فرانت و بکند

توصیه نهایی

ترکیب راهکارهای 1، 2 و 5:

  1. راهکار 1: بررسی وضعیت تایید در ثبت‌نام و اجازه ثبت‌نام برای شماره/ایمیل تایید نشده (با حذف کاربر قبلی)
  2. راهکار 2: بهبود پیام‌های خطا و اطلاع‌رسانی به کاربر
  3. راهکار 5: محدودیت زمانی برای تایید (24 ساعت)

این ترکیب:

  • مشکل کاربر واقعی را حل می‌کند
  • تجربه کاربری بهتری ارائه می‌دهد
  • از انباشت کاربران تایید نشده جلوگیری می‌کند
  • تعادل مناسبی بین امنیت و راحتی کاربر برقرار می‌کند

نکات مهم

  1. امنیت: باید مطمئن شویم که کاربر واقعی است و نمی‌تواند حساب کاربری دیگران را حذف کند
  2. داده‌ها: باید مطمئن شویم که داده‌های کاربر قبلی از دست نرود
  3. لاگ‌گیری: باید تمام عملیات حذف/جایگزینی را لاگ کنیم
  4. اطلاع‌رسانی: باید به کاربر قبلی (در صورت امکان) اطلاع دهیم که حساب کاربری او حذف شده است

فایل‌های نیازمند تغییر

بکند:

  1. hesabixAPI/app/services/auth_service.py - تابع register_user
  2. hesabixAPI/adapters/api/v1/auth.py - endpoint /register
  3. hesabixAPI/app/services/mobile_verification_service.py - بررسی تایید
  4. hesabixAPI/app/services/email_verification_service.py - بررسی تایید

فرانت:

  1. hesabixUI/hesabix_ui/lib/pages/login_page.dart - مدیریت خطاها
  2. hesabixUI/hesabix_ui/lib/pages/profile/verification_page.dart - مدیریت خطاها

سناریوهای تست

  1. کاربر 1 با شماره x ثبت‌نام می‌کند اما تایید نمی‌کند

    • انتظار: کاربر 2 می‌تواند با همان شماره ثبت‌نام کند
  2. کاربر 1 با شماره x ثبت‌نام می‌کند و تایید می‌کند

    • انتظار: کاربر 2 نمی‌تواند با همان شماره ثبت‌نام کند
  3. کاربر 1 با شماره x ثبت‌نام می‌کند، تایید نمی‌کند، و بعد از 24 ساعت کاربر 2 ثبت‌نام می‌کند

    • انتظار: کاربر 2 می‌تواند ثبت‌نام کند
  4. کاربر 1 با شماره x ثبت‌نام می‌کند، تایید نمی‌کند، و کاربر 2 می‌خواهد با همان شماره ثبت‌نام کند

    • انتظار: پیام مناسب نمایش داده شود و کاربر 2 بتواند ثبت‌نام کند