13 KiB
Copilot için Ayrıntılı Prompt: Django 6.0 Custom Account + Djoser + JWT + Social Auth
Aşağıdaki metni Copilot Chat veya GitHub Copilot’a 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)
-
Custom User Model (email tabanlı):
- Login email ile yapılacak (username yok).
- Register da email + password ile olacak.
AUTH_USER_MODELolarak özel bir user modeli (örn.accounts.CustomUser) kullanılacak.USERNAME_FIELD = "email"emailunique olacak.- Normal (email/password) register ile oluşturulan hesaplar:
- Başlangıçta
is_active = Falseolacak. - Kullanıcı e‑posta aktivasyonu yapmadan giriş yapamayacak.
- Başlangıçta
- Social login ile gelen hesaplar:
is_active = Trueolacak (yani sosyal hesaplar için ayrıca email aktivasyon istemeyeceğiz).
-
Register Akışı (Email/Password):
- Örnek endpoint (Djoser varsayılanı da olabilir):
POST /auth/register/ - Request body:
{ "email": "user@example.com", "password": "StrongP@ssw0rd", "re_password": "StrongP@ssw0rd", "first_name": "Ali", "last_name": "Veli" } - İşleyiş:
- Yeni user oluşturulur,
is_active = Falseatanır. - Djoser üzerinden aktivasyon e‑postası gönderilir.
- Aktivasyon linki Djoser’in
ACTIVATION_URLformatına göre hazırlanır:- Örn:
https://frontend-domain/auth/activate/{uid}/{token}/(Nuxt/Next içindeki sayfaya yönlenebilir).
- Örn:
- Yeni user oluşturulur,
- Örnek endpoint (Djoser varsayılanı da olabilir):
-
Email Aktivasyon:
- Endpoint (Djoser):
POST /auth/activate/ - Request body:
{ "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.
- Endpoint (Djoser):
-
Login (JWT ile):
- JWT auth için
djangorestframework_simplejwtkullanılacak. - Djoser’la entegre endpoint:
POST /auth/jwt/create/
- Request body:
{ "email": "user@example.com", "password": "StrongP@ssw0rd" } - Response:
{ "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."
- Örn:
- Uygun bir hata kodu (400/401) ve anlamlı bir hata mesajı dönecek:
- JWT auth için
-
Social Login:
- Özel social auth endpoint’leri istiyorum:
- Örnek:
POST /auth/social/<provider>/(ör:/auth/social/google/,/auth/social/github/).
- Örnek:
- Frontend (Nuxt/Next) tarafı:
- Genelde OAuth flow’u client-side yapıp backend’e
access_tokengönderiyor.
- Genelde OAuth flow’u client-side yapıp backend’e
- Backend tarafı:
- Provider’dan gelen
access_tokenile kullanıcı bilgisi alınacak. - Provider’dan 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 = Trueolarak set edilecek.- Ekstra email aktivasyon e‑postası gönderilmeyecek.
- Ardından JWT access/refresh token üret ve response olarak dön:
{ "access": "<jwt_access_token>", "refresh": "<jwt_refresh_token>", "user": { "id": 1, "email": "user@example.com", "first_name": "Ali", "last_name": "Veli" } }
- Provider’dan gelen
- Özel social auth endpoint’leri istiyorum:
-
Djoser Yapılandırması:
djoser==2.3.3kullanılacak.settings.pyiçindeDJOSER = { ... }konfigürasyonu yapılacak.- Örnek ayarlar:
SEND_ACTIVATION_EMAIL = TrueACTIVATION_URL = "auth/activate/{uid}/{token}/"(buraya Nuxt/Next üzerindeki route’u da koyabiliriz).SERIALIZERSiçinde:user_create→ custom serializer (register sırasındais_active=Falseayarlayacak).user→ custom user serializer (frontend’e gönderilecek user alanlarını kontrol etmek için).
- Token modeli kullanmayacaksak
TOKEN_MODEL = Nonevs.
-
JWT Ayarları (SIMPLE_JWT):
REST_FRAMEWORK→DEFAULT_AUTHENTICATION_CLASSESiçinderest_framework_simplejwt.authentication.JWTAuthenticationtanımlanacak.SIMPLE_JWTiçinde access/refresh lifetime,AUTH_HEADER_TYPES = ("Bearer",)vb. ayarları yapacağız.
-
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_TLSvb.)
- ENV üzerinden SMTP ayarları (
- Aktivasyon için HTML ve plain text template’leri:
templates/email/activation_email.htmltemplates/email/activation_email.txt- sindilik localdeki emailpit kullanalim
- Geliştirme ortamı:
-
CORS / SPA Entegrasyonu:
- Nuxt ve Next için:
CORS_ALLOWED_ORIGINSiçinde dev ve prod URL’ler 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).
- JWT bearer token kullanılacak:
- Nuxt ve Next için:
-
Güvenlik & Rate Limiting:
- Django password validators aktif olacak.
- Auth endpoint’leri için basic throttling / rate limit ayarları öner ve uygula (ör: DRF throttling).
-
Testler:
- En azından aşağıdakiler için tests yaz:
- Register → user oluşturuluyor mu,
is_active=Falsemi, 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 provider’dan user elde ediliyor mu,
is_active=Trueile user oluşturuluyor mu, JWT dönüyor mu?
- Register → user oluşturuluyor mu,
- En azından aşağıdakiler için tests yaz:
-
Dokümantasyon:
- Örnek bir doküman dosyası:
AUTH.mdveyaREADME.mdiçinde bir bölüm:- Tüm auth endpoint’leri
- Örnek request/response’lar
- Nuxt/Next tarafında nasıl kullanılacağına dair ayrintili notlar
- ENV değişkenleri (email, social provider keys vs.)
- Örnek bir doküman dosyası:
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.pyCustomUser(AbstractBaseUser, PermissionsMixin):- Alanlar:
email,first_name,last_name,is_staff,is_active,date_joinedvb. USERNAME_FIELD = "email"REQUIRED_FIELDS = [](veya first_name/last_name)
- Alanlar:
CustomUserManager:create_usercreate_superuser
-
accounts/admin.py- Django admin’de custom user’ı
UserAdmintüreterek kaydet.
- Django admin’de custom user’ı
-
accounts/serializers.pyCustomUserCreateSerializer:- Register sırasında kullanılır.
is_active=Falseset eder.
CustomUserSerializer:- Kullanıcı profilini döner (id, email, first_name, last_name vb.).
SocialLoginSerializer:- Alanlar:
provider,access_token(ve gerekiyorsaid_tokenvs.).
- Alanlar:
-
accounts/views.py- Gerekirse:
SocialLoginView(provider’a göre token doğrulayan, user oluşturan/döndüren, sonra JWT üreten).- İsteğe bağlı:
ResendActivationView.
- Gerekirse:
-
accounts/urls.py/auth/social/<provider>/için route.- Djoser url’leri (register/activate/jwt vb.) de burada veya ana
urls.pyiç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_FRAMEWORKayarları (DEFAULT_AUTHENTICATION_CLASSES, throttling vb.)SIMPLE_JWTayarlarıDJOSERkonfigürasyonuCORS_ALLOWED_ORIGINSEMAIL_BACKENDve diğer email ayarları- Social provider ayarları (
SOCIAL_AUTH_*veya ilgili konfigler)
-
templates/email/activation_email.html -
templates/email/activation_email.txt -
requirements.txtDjango==6.0djangorestframework==3.16.1djoser==2.3.3djangorestframework_simplejwt==5.5.1social-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):
## 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)
Copilot’tan beklediğim ilerleme sırası:
-
Custom User Model
accountsapp oluştur (yoksa).CustomUserveCustomUserManageryaz.AUTH_USER_MODELayarla.- Migrasyonları oluştur ve çalıştırılabilir hale getir (kod olarak migration dosyaları üret).
-
Temel Settings Konfigürasyonu
INSTALLED_APPS,REST_FRAMEWORK,SIMPLE_JWT,DJOSER,CORS,EMAIL_BACKENDvs. temel ayarlar.- Nuxt/Next için örnek CORS domainleri koy (yorum satırı olarak da olabilir).
-
Djoser Register / Activate / JWT
- Djoser’ın default endpoint’lerini aktif et.
CustomUserCreateSerializer’ı bağla, register sırasındais_active=Falseolsun.- Aktivasyon URL’ini Nuxt/Next kullanacak şekilde düzenle.
-
Social Auth Entegrasyonu
- Seçilecek social auth paketini netleştir (preferans:
social-auth-app-django). - Provider konfigleri için env örnekleri yaz.
SocialLoginViewveSocialLoginSerializerile:- Provider token doğrulama
- Email ile user bul/oluştur
is_active=Trueset et- JWT üret ve dön.
- Seçilecek social auth paketini netleştir (preferans:
-
Email Şablonları
- Aktivasyon e-postası için HTML ve text template’leri yaz.
-
Testler
- Temel testler: register, activate, login, social login.
-
Dokümantasyon
AUTH.mdveya README’ye auth bölümünü ekle.
-
COPILOT_MEMORY.md Güncellemeleri
- Her adımda bu dosyaya not düş.
Copilot’a Komutum
Bu prompt’u aldıktan sonra, lütfen:
- Projeyi ve hedefleri özetle.
- Social auth kütüphanesi seçimi için bana 1–2 öneri sun (örnek:
social-auth-app-djangovsdjango-allauth), artılarını/eksilerini kısaca yaz ve hangisini seçmek istediğimi sor. - Ben seçimi yaptıktan sonra şu adımla başla:
- CustomUser model ve manager’ı yaz.
settings.pyiçinde gerekli temel konfigürasyonları ekle (AUTH_USER_MODEL, Djoser, DRF, JWT, CORS, EMAIL).COPILOT_MEMORY.mddosyasına ilk kaydı ekle.
- 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.pygerekli 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.mddosyasına başlangıç girdisini ekle.
Bu prompt’u anladıysan, önce kısaca özetle, sonra social auth kütüphane tercihi için benden seçim iste ve ardından adım 1’e başla.