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: بررسی وضعیت تایید در ثبتنام و اجازه ثبتنام برای شماره/ایمیل تایید نشده (با حذف کاربر قبلی)
- راهکار 2: بهبود پیامهای خطا و اطلاعرسانی به کاربر
- راهکار 5: محدودیت زمانی برای تایید (24 ساعت)
این ترکیب:
- مشکل کاربر واقعی را حل میکند
- تجربه کاربری بهتری ارائه میدهد
- از انباشت کاربران تایید نشده جلوگیری میکند
- تعادل مناسبی بین امنیت و راحتی کاربر برقرار میکند
نکات مهم
- امنیت: باید مطمئن شویم که کاربر واقعی است و نمیتواند حساب کاربری دیگران را حذف کند
- دادهها: باید مطمئن شویم که دادههای کاربر قبلی از دست نرود
- لاگگیری: باید تمام عملیات حذف/جایگزینی را لاگ کنیم
- اطلاعرسانی: باید به کاربر قبلی (در صورت امکان) اطلاع دهیم که حساب کاربری او حذف شده است
فایلهای نیازمند تغییر
بکند:
hesabixAPI/app/services/auth_service.py- تابعregister_userhesabixAPI/adapters/api/v1/auth.py- endpoint/registerhesabixAPI/app/services/mobile_verification_service.py- بررسی تاییدhesabixAPI/app/services/email_verification_service.py- بررسی تایید
فرانت:
hesabixUI/hesabix_ui/lib/pages/login_page.dart- مدیریت خطاهاhesabixUI/hesabix_ui/lib/pages/profile/verification_page.dart- مدیریت خطاها
سناریوهای تست
-
کاربر 1 با شماره x ثبتنام میکند اما تایید نمیکند
- انتظار: کاربر 2 میتواند با همان شماره ثبتنام کند
-
کاربر 1 با شماره x ثبتنام میکند و تایید میکند
- انتظار: کاربر 2 نمیتواند با همان شماره ثبتنام کند
-
کاربر 1 با شماره x ثبتنام میکند، تایید نمیکند، و بعد از 24 ساعت کاربر 2 ثبتنام میکند
- انتظار: کاربر 2 میتواند ثبتنام کند
-
کاربر 1 با شماره x ثبتنام میکند، تایید نمیکند، و کاربر 2 میخواهد با همان شماره ثبتنام کند
- انتظار: پیام مناسب نمایش داده شود و کاربر 2 بتواند ثبتنام کند