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

269 lines
12 KiB
Markdown
Executable file

# مشکلات احتمالی ثبت‌نام با شماره موبایل/ایمیل تایید نشده
## سناریو مشکل
**کاربر 1**: با شماره موبایل `x` یا ایمیل `y` ثبت‌نام می‌کند اما آن را تایید نمی‌کند.
**کاربر 2**: مالک واقعی شماره `x` یا ایمیل `y` می‌خواهد ثبت‌نام کند.
## مشکلات شناسایی شده
### 1. مشکل در بکند - تابع `register_user`
**فایل**: `hesabixAPI/app/services/auth_service.py` (خطوط 88-92)
```python
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`، بررسی کنیم که آیا شماره/ایمیل تایید شده است یا نه
- اگر تایید نشده باشد، به کاربر اجازه دهیم که ثبت‌نام کند (با حذف کاربر قبلی یا جایگزینی)
**مثال**:
```python
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 بتواند ثبت‌نام کند