Files
clinicpro/docs/tasks/task-02-authentication/user_flow.md
T
hamed de1a78a235 feat: Implement SMS sending functionality with KavehNegar and Rangineh providers
- Add SendSmsMessage class for encapsulating SMS message data.
- Create KavehNegarProvider and RanginehProvider classes implementing SmsProviderInterface for sending SMS.
- Implement SmsLogRepository and SmsTemplateRepository for managing SMS logs and templates.
- Develop SendSmsHandler for handling SMS sending messages.
- Create SmsService to manage SMS dispatching and logging.
- Add UserProfileController for managing user profiles with CRUD operations.
- Implement UserProfile entity and repository for user profile data management.
- Update symfony.lock and bootstrap.php for project dependencies and environment setup.
2026-06-09 22:00:34 +03:30

78 lines
2.6 KiB
Markdown

# جریان کاربری — تسک ۰۲: ماژول احراز هویت
## جریان کامل ورود با OTP (جریان واقعی از Drupal)
```
کاربر موبایل را وارد می‌کند
POST /api/v1/user/send-code
{ mobile: "09120671713", captcha_token: "" }
├─► اعتبارسنجی فرمت موبایل (/^(\+98|0)?9\d{9}$/)
├─► بررسی rate limit IP (max 50/hour)
├─► بررسی rate limit Mobile (max 30/hour)
├─► تولید UUID + کد OTP
├─► ذخیره در Redis: otp:{uuid} = {code, mobile} (TTL=1200s)
└─► ارسال SMS
Response: { uuid: "a1b2c3d4-...", message: "..." }
کاربر کد را وارد می‌کند
POST /api/v1/user/verify-code
{ uuid: "a1b2c3d4-...", code: "12345" }
├─► بررسی وجود uuid در Redis
├─► مقایسه code
│ ├─► نادرست: خطا
│ └─► درست: حذف از Redis
└─► Response: { message: "کد با موفقیت تایید شد.", success: true }
⚠️ verify-code در Drupal JWT صادر نمی‌کند!
JWT در مرحله بعد با /oauth/token صادر می‌شود.
POST /oauth/token (MobileGrant)
grant_type=mobile
uuid=a1b2c3d4-... ← همان uuid
code=12345 ← همان code
client_id=clinic-pro
client_secret=...
registration=true ← اگر false باشد، فقط کاربر موجود می‌تواند وارد شود
├─► OtpService::verify(uuid, code)
├─► OtpService::getMobileByUuid(uuid)
├─► بررسی وجود کاربر با این موبایل
│ ├─► وجود دارد: ادامه
│ └─► جدید + registration=true: ایجاد user با status=pending
└─► صدور JWT
Response: { access_token, refresh_token, token_type: "Bearer", expires_in: 3600 }
```
## جریان تمدید Token
```
POST /oauth/token
grant_type=refresh_token
client_id=clinic-pro
client_secret=...
refresh_token=eyJ...
└─► بررسی refresh_token → صدور access_token جدید
```
## جریان دریافت اطلاعات کاربر
```
GET /oauth/userinfo
Authorization: Bearer {access_token}
└─► decode JWT → بازگشت: sub, uuid, name, email, phone_number, scope
```