first commit

This commit is contained in:
Beyhan Oğur
2026-04-26 22:22:29 +03:00
commit ec28a2024d
208 changed files with 23836 additions and 0 deletions

View File

@@ -0,0 +1,314 @@
# Copilot için Ayrıntılı Prompt: Django 6.0 Custom Account + Djoser + JWT + Social Auth
Aşağıdaki metni **Copilot Chat** veya GitHub Copilota vereceğim. Sen (Copilot) bu projede adım adım ilerleyen bir **backend mimarı + uygulayıcı** gibi davranacaksın.
## Proje Bağlamı
- Framework: **Django==6.0**
- API: **Django REST Framework (djangorestframework==3.16.1)**
- Auth:
- **Djoser==2.3.3**
- **djangorestframework_simplejwt==5.5.1**
- Ek olarak **social auth** social-auth-app-django==5.6.0 social-auth-core==4.8.1 bunlar kulanilacak
- Bu proje bir **REST backend** olacak ve **Nuxt.js** ile **Next.js** frontendlere servis verecek.
- SPA (Single Page App) + JWT kullanımına uygun olacak.
- CORS, JSON response formatı, JWT bearer token desteği önemli.(Corsheader Paketi yuklu ve yaplandirlmis)
## İstediğim Auth Sistemi (Özet)
1. **Custom User Model** (email tabanlı):
- Login **email ile** yapılacak (username yok).
- Register da email + password ile olacak.
- `AUTH_USER_MODEL` olarak özel bir user modeli (örn. `accounts.CustomUser`) kullanılacak.
- `USERNAME_FIELD = "email"`
- `email` unique olacak.
- Normal (email/password) register ile oluşturulan hesaplar:
- Başlangıçta `is_active = False` olacak.
- Kullanıcı eposta aktivasyonu yapmadan giriş yapamayacak.
- **Social login** ile gelen hesaplar:
- `is_active = True` olacak (yani sosyal hesaplar için ayrıca email aktivasyon istemeyeceğiz).
2. **Register Akışı (Email/Password)**:
- Örnek endpoint (Djoser varsayılanı da olabilir): `POST /auth/register/`
- Request body:
```json
{
"email": "user@example.com",
"password": "StrongP@ssw0rd",
"re_password": "StrongP@ssw0rd",
"first_name": "Ali",
"last_name": "Veli"
}
```
- İşleyiş:
- Yeni user oluşturulur, `is_active = False` atanır.
- Djoser üzerinden aktivasyon epostası gönderilir.
- Aktivasyon linki Djoserin `ACTIVATION_URL` formatına göre hazırlanır:
- Örn: `https://frontend-domain/auth/activate/{uid}/{token}/` (Nuxt/Next içindeki sayfaya yönlenebilir).
3. **Email Aktivasyon**:
- Endpoint (Djoser): `POST /auth/activate/`
- Request body:
```json
{
"uid": "<uid_from_email>",
"token": "<token_from_email>"
}
```
- Aktivasyon başarılı olursa:
- `user.is_active = True`
- Kullanıcı artık JWT ile login olabilecek.
4. **Login (JWT ile)**:
- JWT auth için `djangorestframework_simplejwt` kullanılacak.
- Djoserla entegre endpoint:
- `POST /auth/jwt/create/`
- Request body:
```json
{
"email": "user@example.com",
"password": "StrongP@ssw0rd"
}
```
- Response:
```json
{
"access": "<jwt_access_token>",
"refresh": "<jwt_refresh_token>"
}
```
- **Aktivasyon yapmamış** kullanıcı login olmaya çalışırsa:
- Uygun bir hata kodu (400/401) ve anlamlı bir hata mesajı dönecek:
- Örn: `"detail": "Account is not activated. Please check your email."`
5. **Social Login**:
- Özel social auth endpointleri istiyorum:
- Örnek: `POST /auth/social/<provider>/` (ör: `/auth/social/google/`, `/auth/social/github/`).
- Frontend (Nuxt/Next) tarafı:
- Genelde OAuth flowu client-side yapıp backende `access_token` gönderiyor.
- Backend tarafı:
- Providerdan gelen `access_token` ile kullanıcı bilgisi alınacak.
- Providerdan email alınamazsa, uygun bir hata dönülecek (misal: `"Email not provided by provider"`).
- Eğer email varsa:
- Kullanıcı bulunursa giriş yaptır, yoksa yeni bir kullanıcı oluştur.
- Bu kullanıcı için:
- `is_active = True` olarak set edilecek.
- **Ekstra email aktivasyon epostası gönderilmeyecek**.
- Ardından JWT access/refresh token üret ve response olarak dön:
```json
{
"access": "<jwt_access_token>",
"refresh": "<jwt_refresh_token>",
"user": {
"id": 1,
"email": "user@example.com",
"first_name": "Ali",
"last_name": "Veli"
}
}
```
6. **Djoser Yapılandırması**:
- `djoser==2.3.3` kullanılacak.
- `settings.py` içinde `DJOSER = { ... }` konfigürasyonu yapılacak.
- Örnek ayarlar:
- `SEND_ACTIVATION_EMAIL = True`
- `ACTIVATION_URL = "auth/activate/{uid}/{token}/"` (buraya Nuxt/Next üzerindeki routeu da koyabiliriz).
- `SERIALIZERS` içinde:
- `user_create` → custom serializer (register sırasında `is_active=False` ayarlayacak).
- `user` → custom user serializer (frontende gönderilecek user alanlarını kontrol etmek için).
- Token modeli kullanmayacaksak `TOKEN_MODEL = None` vs.
7. **JWT Ayarları (SIMPLE_JWT)**:
- `REST_FRAMEWORK` → `DEFAULT_AUTHENTICATION_CLASSES` içinde `rest_framework_simplejwt.authentication.JWTAuthentication` tanımlanacak.
- `SIMPLE_JWT` içinde access/refresh lifetime, `AUTH_HEADER_TYPES = ("Bearer",)` vb. ayarları yapacağız.
8. **Email Gönderimi**:
- Geliştirme ortamı:
- `EMAIL_BACKEND = "django.core.mail.backends.console.EmailBackend"` olabilir.
- Prod ortamı:
- ENV üzerinden SMTP ayarları (`EMAIL_HOST`, `EMAIL_PORT`, `EMAIL_HOST_USER`, `EMAIL_HOST_PASSWORD`, `EMAIL_USE_TLS` vb.)
- Aktivasyon için HTML ve plain text templateleri:
- `templates/email/activation_email.html`
- `templates/email/activation_email.txt`
- sindilik localdeki emailpit kullanalim
9. **CORS / SPA Entegrasyonu**:
- Nuxt ve Next için:
- `CORS_ALLOWED_ORIGINS` içinde dev ve prod URLler olacak (örn. `http://localhost:3000`, `http://localhost:5173`, vs.).
- Auth:
- JWT bearer token kullanılacak: `Authorization: Bearer <access_token>`
- Cookie tabanlı session auth kullanmayacağız (veya minimal). CSRF, SPA senaryosuna göre ayarlanacak / devre dışı bırakılacak (bunu açıklayan bir not yaz).
10. **Güvenlik & Rate Limiting**:
- Django password validators aktif olacak.
- Auth endpointleri için basic throttling / rate limit ayarları öner ve uygula (ör: DRF throttling).
11. **Testler**:
- En azından aşağıdakiler için tests yaz:
- Register → user oluşturuluyor mu, `is_active=False` mi, email aktivasyonu tetikleniyor mu?
- Activate → doğru uid/token ile aktivasyon başarılı mı? Yanlış ise hata veriyor mu?
- Login → aktif kullanıcı login olabiliyor mu? Aktif olmayan için hata dönüyor mu?
- Social login → access_token üzerinden providerdan user elde ediliyor mu, `is_active=True` ile user oluşturuluyor mu, JWT dönüyor mu?
12. **Dokümantasyon**:
- Örnek bir doküman dosyası: `AUTH.md` veya `README.md` içinde bir bölüm:
- Tüm auth endpointleri
- Örnek request/responselar
- Nuxt/Next tarafında nasıl kullanılacağına dair ayrintili notlar
- ENV değişkenleri (email, social provider keys vs.)
## Dosya ve Kod Yapı Planı
Aşağıdakiler bir referans plan; proje yapısına göre isimler uyarlanabilir (örn. `config/settings.py` vs. `project/settings.py`).
- `accounts/models.py`
- `CustomUser(AbstractBaseUser, PermissionsMixin)`:
- Alanlar: `email`, `first_name`, `last_name`, `is_staff`, `is_active`, `date_joined` vb.
- `USERNAME_FIELD = "email"`
- `REQUIRED_FIELDS = []` (veya first_name/last_name)
- `CustomUserManager`:
- `create_user`
- `create_superuser`
- `accounts/admin.py`
- Django adminde custom userı `UserAdmin` türeterek kaydet.
- `accounts/serializers.py`
- `CustomUserCreateSerializer`:
- Register sırasında kullanılır.
- `is_active=False` set eder.
- `CustomUserSerializer`:
- Kullanıcı profilini döner (id, email, first_name, last_name vb.).
- `SocialLoginSerializer`:
- Alanlar: `provider`, `access_token` (ve gerekiyorsa `id_token` vs.).
- `accounts/views.py`
- Gerekirse:
- `SocialLoginView` (providera göre token doğrulayan, user oluşturan/döndüren, sonra JWT üreten).
- İsteğe bağlı: `ResendActivationView`.
- `accounts/urls.py`
- `/auth/social/<provider>/` için route.
- Djoser urlleri (register/activate/jwt vb.) de burada veya ana `urls.py` içinde include edilebilir.
- `config/settings.py` (veya proje settings dosyası)
- `INSTALLED_APPS`:
- `'accounts'`
- `'rest_framework'`
- `'djoser'`
- `'rest_framework_simplejwt'`
- `'corsheaders'`
- Social auth için: `'social_django'` veya seçtiğimiz paket.
- `AUTH_USER_MODEL = "accounts.CustomUser"`
- `REST_FRAMEWORK` ayarları (`DEFAULT_AUTHENTICATION_CLASSES`, throttling vb.)
- `SIMPLE_JWT` ayarları
- `DJOSER` konfigürasyonu
- `CORS_ALLOWED_ORIGINS`
- `EMAIL_BACKEND` ve diğer email ayarları
- Social provider ayarları (`SOCIAL_AUTH_*` veya ilgili konfigler)
- `templates/email/activation_email.html`
- `templates/email/activation_email.txt`
- `requirements.txt`
- `Django==6.0`
- `djangorestframework==3.16.1`
- `djoser==2.3.3`
- `djangorestframework_simplejwt==5.5.1`
- `social-auth-app-django` (veya tercih ettiğimiz social auth paketi)
- `django-cors-headers`
- `tests/test_accounts.py`
- Yukarıda bahsettiğim tüm kritik akışlar için testler.
## Hafıza / Progress Kaydı: COPILOT_MEMORY.md
Projede ne yapıldığını **hatırlamak** için özel bir dosya istiyorum:
- Repo kökünde: `COPILOT_MEMORY.md`
- Copilot, her önemli adım veya mantıklı grup değişiklikten sonra bu dosyaya **append** yapsın.
- Kayıt formatı şöyle olsun (örnek):
```markdown
## 2025-12-11T14:32:00Z
- Değişiklik özeti:
- CustomUser model ve manager eklendi.
- settings.py'de AUTH_USER_MODEL ve djoser/jwt ayarlarının temeli kuruldu.
- Dosyalar:
- accounts/models.py
- accounts/admin.py
- config/settings.py
- Next steps:
- Custom registration serializer ve activation email şablonlarını ekle.
```
Kurallar:
- Her anlamlı değişiklik setinden sonra yeni bir `## <ISO 8601 timestamp>` başlığı ile blok ekle.
- Bir sonraki yapılacakları (Next steps) kısa ve net yaz.
- Eğer PR açıyorsan, ilgili PR açıklamasına bu kaydın kısa özetini de ekle.
## Geliştirme Adımları (Önerilen Sıra)
Copilottan beklediğim ilerleme sırası:
1. **Custom User Model**
- `accounts` app oluştur (yoksa).
- `CustomUser` ve `CustomUserManager` yaz.
- `AUTH_USER_MODEL` ayarla.
- Migrasyonları oluştur ve çalıştırılabilir hale getir (kod olarak migration dosyaları üret).
2. **Temel Settings Konfigürasyonu**
- `INSTALLED_APPS`, `REST_FRAMEWORK`, `SIMPLE_JWT`, `DJOSER`, `CORS`, `EMAIL_BACKEND` vs. temel ayarlar.
- Nuxt/Next için örnek CORS domainleri koy (yorum satırı olarak da olabilir).
3. **Djoser Register / Activate / JWT**
- Djoserın default endpointlerini aktif et.
- `CustomUserCreateSerializer`ı bağla, register sırasında `is_active=False` olsun.
- Aktivasyon URLini Nuxt/Next kullanacak şekilde düzenle.
4. **Social Auth Entegrasyonu**
- Seçilecek social auth paketini netleştir (preferans: `social-auth-app-django`).
- Provider konfigleri için env örnekleri yaz.
- `SocialLoginView` ve `SocialLoginSerializer` ile:
- Provider token doğrulama
- Email ile user bul/oluştur
- `is_active=True` set et
- JWT üret ve dön.
5. **Email Şablonları**
- Aktivasyon e-postası için HTML ve text templateleri yaz.
6. **Testler**
- Temel testler: register, activate, login, social login.
7. **Dokümantasyon**
- `AUTH.md` veya READMEye auth bölümünü ekle.
8. **COPILOT_MEMORY.md Güncellemeleri**
- Her adımda bu dosyaya not düş.
## Copilota Komutum
Bu promptu aldıktan sonra, lütfen:
1. Projeyi ve hedefleri özetle.
2. Social auth kütüphanesi seçimi için bana 12 öneri sun (örnek: `social-auth-app-django` vs `django-allauth`), artılarını/eksilerini kısaca yaz ve **hangisini seçmek istediğimi sor**.
3. Ben seçimi yaptıktan sonra şu adımla başla:
- CustomUser model ve managerı yaz.
- `settings.py` içinde gerekli temel konfigürasyonları ekle (AUTH_USER_MODEL, Djoser, DRF, JWT, CORS, EMAIL).
- `COPILOT_MEMORY.md` dosyasına ilk kaydı ekle.
4. Her büyük adım sonunda:
- Hangi dosyaları değiştirdiğini kısaca özetle.
- `COPILOT_MEMORY.md`ye uygun formatta giriş ekle.
- Bir sonraki adımı bana öner ve onayımı bekle (veya devam etmemi iste).
Başlangıç komutum:
> **Başla**:
> - CustomUser model ve manager oluştur.
> - `settings.py` gerekli auth (Djoser + JWT + DRF + CORS + EMAIL) konfigürasyonlarını ekle.
> - Djoserın register/activate/jwt endpointlerini temel haliyle ayağa kaldıracak url ve ayarları hazırla.
> - `COPILOT_MEMORY.md` dosyasına başlangıç girdisini ekle.
Bu promptu anladıysan, önce kısaca özetle, sonra social auth kütüphane tercihi için benden seçim iste ve ardından adım 1e başla.