# Authentication & Account API Documentation ## فهرست مطالب - [مکانیزم احراز هویت](#مکانیزم-احراز-هویت) - [فرمت کلی پاسخ‌ها](#فرمت-کلی-پاسخها) - [مدل کاربر](#مدل-کاربر) - [Auth Endpoints](#auth-endpoints) - [ثبت‌نام](#1-ثبت‌نام) - [ورود با رمز عبور](#2-ورود-با-رمز-عبور) - [درخواست OTP](#3-درخواست-otp) - [تأیید OTP](#4-تأیید-otp) - [رفرش توکن](#5-رفرش-توکن) - [Account Endpoints](#account-endpoints) - [آپدیت پروفایل](#1-آپدیت-پروفایل) - [احراز هویت در درخواست‌ها](#احراز-هویت-در-درخواستها) - [کدهای خطا](#کدهای-خطا) --- ## مکانیزم احراز هویت پروژه از **JWT (JSON Web Token)** با کتابخانه `djangorestframework-simplejwt` استفاده می‌کند. - هر بار که کاربر ثبت‌نام یا لاگین موفق انجام می‌دهد، دو توکن دریافت می‌کند: - **`access`** — توکن کوتاه‌مدت برای احراز هویت درخواست‌ها - **`refresh`** — توکن بلندمدت برای گرفتن `access` جدید - برای اندپوینت‌هایی که نیاز به احراز هویت دارند، باید توکن `access` را در هدر `Authorization` ارسال کنید: ``` Authorization: Bearer ``` - Backend احراز هویت: `MultiFieldBackend` — کاربر می‌تواند با `username`، `email` یا `phone_number` لاگین کند. --- ## فرمت کلی پاسخ‌ها همه پاسخ‌ها از یک ساختار یکسان پیروی می‌کنند: ```json { "code": 200, "msg": "success", "data": { ... } } ``` | فیلد | نوع | توضیح | |---------|---------|---------------------------------------------| | `code` | integer | کد وضعیت (مشابه HTTP status) | | `msg` | string | پیام وضعیت (`"success"` یا متن خطا) | | `data` | object | داده‌های برگشتی (در صورت وجود) | | `token` | object | توکن‌های JWT (فقط در پاسخ‌های auth) | --- ## مدل کاربر شیء `AuthUser` که در پاسخ‌های احراز هویت و پروفایل برگردانده می‌شود: ```json { "id": 1, "username": "john_doe", "email": "john@example.com", "first_name": "John", "last_name": "Doe", "phone_number": "09121234567" } ``` --- ## Auth Endpoints Base URL: `/api/auth/` --- ### 1. ثبت‌نام **`POST /api/auth/register/`** ساخت حساب کاربری جدید با نام کاربری، ایمیل، شماره موبایل و رمز عبور. #### Request Body ```json { "username": "john_doe", "email": "john@example.com", "phone_number": "09121234567", "password": "securepass123", "first_name": "John", "last_name": "Doe" } ``` | فیلد | نوع | الزامی | توضیح | |----------------|--------|--------|-------------------------------| | `username` | string | ✅ | حداکثر ۱۵۰ کاراکتر، یکتا | | `email` | string | ✅ | فرمت ایمیل، یکتا | | `phone_number` | string | ✅ | حداکثر ۳۲ کاراکتر، یکتا | | `password` | string | ✅ | حداقل ۸ کاراکتر | | `first_name` | string | ❌ | حداکثر ۱۵۰ کاراکتر | | `last_name` | string | ❌ | حداکثر ۱۵۰ کاراکتر | #### Response موفق — `201 Created` ```json { "code": 201, "msg": "success", "data": { "id": 1, "username": "john_doe", "email": "john@example.com", "first_name": "John", "last_name": "Doe", "phone_number": "09121234567" }, "token": { "access": "", "refresh": "" } } ``` #### Response خطا — `400 Bad Request` ```json { "code": 400, "msg": "A user with this username already exists." } ``` پیام‌های خطای احتمالی: - `"A user with this username already exists."` - `"A user with this email already exists."` - `"A user with this phone number already exists."` - `"A user with these credentials already exists."` --- ### 2. ورود با رمز عبور **`POST /api/auth/login/`** ورود با استفاده از `username`، `email` یا `phone_number` به همراه رمز عبور. #### Request Body ```json { "identifier": "john_doe", "password": "securepass123" } ``` | فیلد | نوع | الزامی | توضیح | |--------------|--------|--------|-----------------------------------------------------| | `identifier` | string | ✅ | می‌تواند `username`، `email` یا `phone_number` باشد | | `password` | string | ✅ | رمز عبور کاربر | #### Response موفق — `200 OK` ```json { "code": 200, "msg": "success", "data": { "id": 1, "username": "john_doe", "email": "john@example.com", "first_name": "John", "last_name": "Doe", "phone_number": "09121234567" }, "token": { "access": "", "refresh": "" } } ``` #### Response خطا — `401 Unauthorized` ```json { "code": 401, "msg": "Invalid credentials." } ``` --- ### 3. درخواست OTP **`POST /api/auth/request-otp/`** > ⚠️ این endpoint در حال حاضر در `urls.py` کامنت شده است (غیرفعال). ارسال کد یکبار مصرف (OTP) به شماره موبایل از طریق SMS.ir. #### Request Body ```json { "phone_number": "09121234567" } ``` | فیلد | نوع | الزامی | توضیح | |----------------|--------|--------|---------------------| | `phone_number` | string | ✅ | حداکثر ۳۲ کاراکتر | #### Response موفق — `200 OK` ```json { "code": 200, "msg": "success", "token": "" } ``` | فیلد | توضیح | |---------------|--------------------------------------------------------------| | `token` | توکن امضاشده که باید در مرحله verify-otp ارسال شود | | `sms_warning` | (اختیاری) در صورت شکست ارسال پیامک ظاهر می‌شود | | `debug_otp` | (اختیاری) فقط در حالت `DEBUG=True` — کد OTP در پاسخ می‌آید | > کد OTP مدت اعتبار **۳۰۰ ثانیه (۵ دقیقه)** دارد. --- ### 4. تأیید OTP **`POST /api/auth/verify-otp/`** > ⚠️ این endpoint در حال حاضر در `urls.py` کامنت شده است (غیرفعال). تأیید کد OTP دریافت‌شده و ورود/ثبت‌نام خودکار کاربر. #### Request Body ```json { "token": "", "otp_code": "123456" } ``` | فیلد | نوع | الزامی | توضیح | |------------|--------|--------|-------------------------------------------| | `token` | string | ✅ | توکن دریافت‌شده از مرحله request-otp | | `otp_code` | string | ✅ | کد ۶ رقمی ارسال‌شده به موبایل | #### Response موفق — `200 OK` ```json { "code": 200, "msg": "success", "data": { "id": 1, "username": "09121234567", "email": "09121234567@otp.local", "first_name": "", "last_name": "", "phone_number": "09121234567" }, "token": { "access": "", "refresh": "" } } ``` > اگر کاربر با این شماره موبایل قبلاً ثبت‌نام نکرده باشد، حساب جدید به‌صورت خودکار ساخته می‌شود. #### Response خطا — `400 Bad Request` ```json { "code": 400, "msg": "Token is invalid or expired." } ``` یا: ```json { "code": 400, "msg": "OTP code is invalid or expired." } ``` --- ### 5. رفرش توکن **`POST /api/auth/token/refresh/`** دریافت `access` token جدید با استفاده از `refresh` token. > این endpoint توسط `djangorestframework-simplejwt` به‌صورت پیش‌فرض فراهم می‌شود. #### Request Body ```json { "refresh": "" } ``` #### Response موفق — `200 OK` ```json { "access": "" } ``` --- ## Account Endpoints Base URL: `/api/account/` --- ### 1. آپدیت پروفایل **`PATCH /api/account/profile/`** > 🔒 نیاز به احراز هویت دارد — هدر `Authorization: Bearer ` الزامی است. ویرایش اطلاعات پروفایل کاربر لاگین‌شده. #### Request Body همه فیلدها اختیاری هستند (partial update): ```json { "first_name": "علی", "last_name": "احمدی", "email": "new_email@example.com" } ``` | فیلد | نوع | الزامی | توضیح | |--------------|--------|--------|---------------------| | `first_name` | string | ❌ | حداکثر ۱۵۰ کاراکتر | | `last_name` | string | ❌ | حداکثر ۱۵۰ کاراکتر | | `email` | string | ❌ | فرمت ایمیل معتبر | #### Response موفق — `200 OK` ```json { "code": 200, "msg": "success", "data": { "id": 1, "username": "john_doe", "email": "new_email@example.com", "first_name": "علی", "last_name": "احمدی", "phone_number": "09121234567" } } ``` #### Response خطا — `401 Unauthorized` در صورت نبود یا منقضی بودن توکن: ```json { "detail": "Authentication credentials were not provided." } ``` --- ## احراز هویت در درخواست‌ها برای اندپوینت‌هایی که نیاز به احراز هویت دارند (مانند `PATCH /api/account/profile/`)، توکن `access` را در هدر HTTP ارسال کنید: ``` Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... ``` ### چرخه عمر توکن ``` [ثبت‌نام / لاگین] ↓ دریافت access + refresh ↓ ارسال درخواست‌ها با access ↓ منقضی شدن access (401) ↓ ارسال refresh به POST /api/auth/token/refresh/ ↓ دریافت access جدید ``` --- ## کدهای خطا | HTTP Status | code | معنا | |-------------|------|-----------------------------------------------| | 201 | 201 | ثبت‌نام موفق | | 200 | 200 | عملیات موفق | | 400 | 400 | داده‌های نامعتبر یا OTP/توکن اشتباه | | 401 | 401 | احراز هویت ناموفق (رمز اشتباه یا بدون توکن) | > پاسخ‌های خطای اعتبارسنجی serializer (مانند فیلد اجباری) با فرمت استاندارد DRF برگردانده می‌شوند: > ```json > { > "field_name": ["This field is required."] > } > ```