Bu yazıda /protected endpoint’ini yazarken yaptığım hataları
ve JWT token konusunda öğrendiklerimi paylaşıyorum.
GET /protected?token=eyJhbG...
Token URL’de görününce tarayıcı geçmişine, sunucu loglarına ve proxy’lere düşer. Güvenlik açığı.
curl -X GET http://localhost:8000/protected \
-H "Authorization: Bearer eyJhbG..."
Token -H ile header’da gidiyor. HTTPS ile şifrelenmiş
iletiliyor, ortada kimse göremez.
/protected‘ı önce POST olarak yazdım.
“POST body’e gönderir, daha güvenli” diye düşündüm.
GET/POST seçimi güvenlikle değil, ne yaptığınla ilgili:
| Method | Ne zaman? |
|---|---|
| GET | Veri okurken |
| POST | Veri oluştururken |
| PUT | Veri güncellerken |
| DELETE | Veri silerken |
/protected‘da sadece “ben kimim” diye soruyoruz —
veri okuyoruz. Bu yüzden GET.
get_current_user‘ı Manuel Çağırmak@app.get("/protected")
def protected(token: str):
return get_current_user(token) # manuel çağrı
get_current_user içinde db: Session = Depends(get_db) var.
Manuel çağırınca FastAPI devreye girmiyor —
db‘ye gerçek session yerine Depends objesi gidiyor.
'Depends' object has no attribute 'query' hatası alıyorsun.
@app.get("/protected")
def protected(current_user = Depends(get_current_user)):
return {"email": current_user}
Depends FastAPI’ye “bu fonksiyonu sen çağır,
gerekli parametreleri sen inject et” diyor.
db, token — hepsini FastAPI kendisi hallediyor.
/todos/5/todos?skip=0&limit=10Bunlar ya header’da ya da body’de gitmeli.
Testlerde curl kullandım, parametreleri öğrendim:
curl -X POST http://localhost:8000/login \
-H "Content-Type: application/json" \
-d '{"email": "test@test.com", "password": "123"}'
-X → HTTP metodu (GET, POST, PUT, DELETE)-H → Header (metadata: kim olduğun, hangi format)-d → Body (asıl veri)Zarfa benzetirsek:
-H → zarfın üstündeki bilgiler-d → zarfın içindeki mektupDepends olan fonksiyonlar manuel çağrılamaz,
FastAPI inject etmeli