Add admin login API and remove hardcoded secrets

- Add token-based admin login/logout/me endpoints
- Bootstrap admin from ADMIN_USERNAME/ADMIN_PASSWORD in Docker entrypoint
- Read ALLOWED_HOSTS and CORS from env only (no hardcoded server IPs)
- Keep docs/Postman/tests free of real credentials
- Cover login and auth flows with 31 local API tests

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Shayan Azadi
2026-07-16 17:29:47 +03:30
parent 7e71d922d3
commit 50c9cf613f
13 changed files with 791 additions and 141 deletions

View File

@@ -9,11 +9,12 @@
## وضعیت تست‌ها
```
Ran 24 tests — OK (0 failures)
Ran 31 tests — OK (0 failures)
```
| تعداد تست | گروه |
|-----------|------|
| ۷ تست | Admin Login |
| ۶ تست | Contact Us |
| ۱۱ تست | Compositions |
| ۷ تست | Campaigns |
@@ -56,9 +57,70 @@ python manage.py test api -v 2
|--------|--------|
| عمومی — بدون نیاز به ورود | لیست و جزئیات (متد `GET`) |
| عمومی — بدون نیاز به ورود | ایجاد (متد `POST`) |
| فقط ادمین — نیاز به احراز هویت | ویرایش و حذف (متدهای `PUT`، `PATCH`، `DELETE`) |
| فقط ادمین — نیاز به توکن | ویرایش و حذف (متدهای `PUT`، `PATCH`، `DELETE`) |
برای درخواست‌های ادمین در Postman می‌توانید از **Basic Auth** با نام کاربری و رمز ادمین استفاده کنید.
---
## ۰. ورود ادمین (Admin Login)
| مقدار | مورد |
|--------|------|
| `{{admin_username}}` از env (`ADMIN_USERNAME`) | نام کاربری |
| `{{admin_password}}` از env (`ADMIN_PASSWORD`) | رمز عبور |
| `{{base_url}}/admin/` | پنل جنگو ادمین |
| `POST {{base_url}}/api/admin/login/` | ورود از طریق API |
> نام کاربری و رمز در کد هاردکد نمی‌شوند. روی سرور در فایل `.env` تنظیم کنید.
### ورود و دریافت توکن
```
POST {{base_url}}/api/admin/login/
Content-Type: application/json
```
```json
{
"username": "{{admin_username}}",
"password": "{{admin_password}}"
}
```
**پاسخ نمونه:**
```json
{
"token": "<token>",
"user": {
"id": 1,
"username": "<admin_username>",
"is_staff": true,
"is_superuser": true
}
}
```
در درخواست‌های محافظت‌شده این هدر را بفرستید:
```
Authorization: Token <token>
```
### اطلاعات ادمین فعلی
```
GET {{base_url}}/api/admin/me/
Authorization: Token <token>
```
### خروج (حذف توکن)
```
POST {{base_url}}/api/admin/logout/
Authorization: Token <token>
```
برای درخواست‌های ادمین در Postman، ابتدا login کنید، سپس توکن را در متغیر `admin_token` بگذارید.
---
@@ -492,26 +554,29 @@ backend/Zoneco_ORG_API.postman_collection.json
| دسترسی | Endpoint | Method | # |
|--------|----------|--------|---|
| عمومی | `/api/contact-us/` | GET | 1 |
| عمومی | `/api/contact-us/` | POST | 2 |
| عمومی | `/api/contact-us/{id}/` | GET | 3 |
| عمومی | `/api/contact-us/by_category/?category=...` | GET | 4 |
| ادمین | `/api/contact-us/{id}/` | PUT/PATCH/DELETE | 5 |
| عمومی | `/api/compositions/` | GET | 6 |
| عمومی | `/api/compositions/` | POST | 7 |
| عمومی | `/api/compositions/{id}/` | GET | 8 |
| عمومی | `/api/compositions/by-created-at/?from=...&to=...` | GET | 9 |
| ادمین | `/api/compositions/{id}/add-images/` | POST | 10 |
| ادمین | `/api/compositions/{id}/set-main-image/` | POST | 11 |
| ادمین | `/api/compositions/{id}/images/{image_id}/` | DELETE | 12 |
| ادمین | `/api/compositions/{id}/` | PUT/PATCH/DELETE | 13 |
| عمومی | `/api/campaigns/` | GET | 14 |
| عمومی | `/api/campaigns/` | POST | 15 |
| عمومی | `/api/campaigns/{id}/` | GET | 16 |
| عمومی | `/api/campaigns/active/` | GET | 17 |
| عمومی | `/api/campaigns/upcoming/` | GET | 18 |
| عمومی | `/api/campaigns/ended/` | GET | 19 |
| ادمین | `/api/campaigns/{id}/` | PUT/PATCH/DELETE | 20 |
| عمومی | `/api/admin/login/` | POST | 1 |
| ادمین | `/api/admin/logout/` | POST | 2 |
| ادمین | `/api/admin/me/` | GET | 3 |
| عمومی | `/api/contact-us/` | GET | 4 |
| عمومی | `/api/contact-us/` | POST | 5 |
| عمومی | `/api/contact-us/{id}/` | GET | 6 |
| عمومی | `/api/contact-us/by_category/?category=...` | GET | 7 |
| ادمین | `/api/contact-us/{id}/` | PUT/PATCH/DELETE | 8 |
| عمومی | `/api/compositions/` | GET | 9 |
| عمومی | `/api/compositions/` | POST | 10 |
| عمومی | `/api/compositions/{id}/` | GET | 11 |
| عمومی | `/api/compositions/by-created-at/?from=...&to=...` | GET | 12 |
| ادمین | `/api/compositions/{id}/add-images/` | POST | 13 |
| ادمین | `/api/compositions/{id}/set-main-image/` | POST | 14 |
| ادمین | `/api/compositions/{id}/images/{image_id}/` | DELETE | 15 |
| ادمین | `/api/compositions/{id}/` | PUT/PATCH/DELETE | 16 |
| عمومی | `/api/campaigns/` | GET | 17 |
| عمومی | `/api/campaigns/` | POST | 18 |
| عمومی | `/api/campaigns/{id}/` | GET | 19 |
| عمومی | `/api/campaigns/active/` | GET | 20 |
| عمومی | `/api/campaigns/upcoming/` | GET | 21 |
| عمومی | `/api/campaigns/ended/` | GET | 22 |
| ادمین | `/api/campaigns/{id}/` | PUT/PATCH/DELETE | 23 |
> **توجه:** در Postman قبل از هر مسیر، مقدار `{{base_url}}` را قرار دهید.
> مثال: `{{base_url}}/api/campaigns/active/`