forked from hesabix/arc
269 lines
12 KiB
Markdown
Executable file
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 بتواند ثبتنام کند
|
|
|