Files
docs-fastapi/docs/tr/docs/tutorial/security/first-steps.md
T

9.2 KiB
Raw Blame History

Güvenlik - İlk Adımlar

backend APInizin bir domainde olduğunu düşünelim.

Ve başka bir domainde ya da aynı domainin farklı bir pathinde (veya bir mobil uygulamada) bir frontendiniz var.

Ve frontendin, username ve password kullanarak backend ile kimlik doğrulaması yapabilmesini istiyorsunuz.

Bunu FastAPI ile OAuth2 kullanarak oluşturabiliriz.

Ama ihtiyacınız olan küçük bilgi parçalarını bulmak için uzun spesifikasyonun tamamını okuma zahmetine girmeyelim.

Güvenliği yönetmek için FastAPInin sunduğu araçları kullanalım.

Nasıl Görünüyor

Önce kodu kullanıp nasıl çalıştığına bakalım, sonra neler olup bittiğini anlamak için geri döneriz.

main.py Oluşturun

Örneği main.py adlı bir dosyaya kopyalayın:

{* ../../docs_src/security/tutorial001_an_py310.py *}

Çalıştırın

/// note | Not

python-multipart paketi, pip install "fastapi[standard]" komutunu çalıştırdığınızda FastAPI ile birlikte otomatik olarak kurulur.

Ancak pip install fastapi komutunu kullanırsanız, python-multipart paketi varsayılan olarak dahil edilmez.

Elle kurmak için bir Sanal ortam oluşturduğunuzdan, onu aktive ettiğinizden emin olun ve ardından şununla kurun:

$ pip install python-multipart

Bunun nedeni, OAuth2nin username ve password göndermek için "form data" kullanmasıdır.

///

Örneği şu şekilde çalıştırın:

$ fastapi dev

<span style="color: green;">INFO</span>:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)

Kontrol Edin

Etkileşimli dokümantasyona gidin: http://127.0.0.1:8000/docs.

Şuna benzer bir şey göreceksiniz:

/// tip | Authorize butonu!

Artık parıl parıl yeni bir "Authorize" butonunuz var.

Ayrıca path operation’ınızın sağ üst köşesinde tıklayabileceğiniz küçük bir kilit simgesi de bulunuyor.

///

Ve ona tıklarsanız, username ve password (ve diğer opsiyonel alanları) girebileceğiniz küçük bir yetkilendirme formu görürsünüz:

/// note | Not

Formda ne yazdığınızın önemi yok; şimdilik çalışmayacak. Ama birazdan oraya da geleceğiz.

///

Bu, elbette son kullanıcılar için bir frontend değil; ancak tüm APInizi etkileşimli şekilde belgelemek için harika bir otomatik araçtır.

Frontend ekibi tarafından kullanılabilir (bu ekip siz de olabilirsiniz).

Üçüncü taraf uygulamalar ve sistemler tarafından kullanılabilir.

Ve aynı uygulamayı debug etmek, kontrol etmek ve test etmek için sizin tarafınızdan da kullanılabilir.

password Flow

Şimdi biraz geri dönüp bunların ne olduğuna bakalım.

password "flow"u, OAuth2de güvenlik ve authentication’ı yönetmek için tanımlanmış yöntemlerden ("flow"lardan) biridir.

OAuth2, backendin veya APInin, kullanıcıyı authenticate eden serverdan bağımsız olabilmesi için tasarlanmıştır.

Ancak bu örnekte, aynı FastAPI uygulaması hem APIyi hem de authentication’ı yönetecek.

O yüzden basitleştirilmiş bu bakış açısından üzerinden geçelim:

  • Kullanıcı frontendde username ve password yazar ve Entera basar.
  • Frontend (kullanıcının browser’ında çalışır), bu username ve password değerlerini APImizdeki belirli bir URLye gönderir (tokenUrl="token" ile tanımlanan).
  • API, username ve password değerlerini kontrol eder ve bir "token" ile response döner (henüz bunların hiçbirini implement etmedik).
    • "Token", daha sonra bu kullanıcıyı doğrulamak için kullanabileceğimiz içerik taşıyan bir stringdir.
    • Normalde token’ın bir süre sonra süresi dolacak şekilde ayarlanması beklenir.
      • Böylece kullanıcının bir noktada tekrar giriş yapması gerekir.
      • Ayrıca token çalınırsa risk daha düşük olur. Çoğu durumda, sonsuza kadar çalışacak kalıcı bir anahtar gibi değildir.
  • Frontend bu token’ı geçici olarak bir yerde saklar.
  • Kullanıcı frontendde tıklayarak web uygulamasının başka bir bölümüne gider.
  • Frontendin APIden daha fazla veri alması gerekir.
    • Ancak o endpoint için authentication gereklidir.
    • Bu yüzden APImizle authenticate olmak için Authorization header’ını, Bearer + token değeriyle gönderir.
    • Token foobar içeriyorsa Authorization header’ının içeriği Bearer foobar olur.

FastAPInin OAuth2PasswordBearer’ı

FastAPI, bu güvenlik özelliklerini implement etmek için farklı soyutlama seviyelerinde çeşitli araçlar sağlar.

Bu örnekte OAuth2yi, Password flow ile, Bearer token kullanarak uygulayacağız. Bunu OAuth2PasswordBearer sınıfı ile yaparız.

/// note | Not

"Bearer" token tek seçenek değildir.

Ama bizim kullanım senaryomuz için en iyi seçenek odur.

Ayrıca bir OAuth2 uzmanı değilseniz ve ihtiyaçlarınıza daha uygun başka bir seçeneğin neden gerekli olduğunu net olarak bilmiyorsanız, çoğu kullanım senaryosu için de en uygun seçenek olacaktır.

Bu durumda bile FastAPI, onu oluşturabilmeniz için gereken araçları sunar.

///

OAuth2PasswordBearer sınıfının bir instance’ını oluştururken tokenUrl parametresini veririz. Bu parametre, client’ın (kullanıcının browser’ında çalışan frontendin) token almak için username ve password göndereceği URLyi içerir.

{* ../../docs_src/security/tutorial001_an_py310.py hl[8] *}

/// tip | İpucu

Burada tokenUrl="token", henüz oluşturmadığımız göreli bir URL olan token’ı ifade eder. Göreli URL olduğu için ./token ile eşdeğerdir.

Göreli URL kullandığımız için, APIniz https://example.com/ adresinde olsaydı https://example.com/token anlamına gelirdi. Ama APIniz https://example.com/api/v1/ adresinde olsaydı, bu kez https://example.com/api/v1/token anlamına gelirdi.

Göreli URL kullanmak, Bir Proxy Arkasında gibi daha ileri kullanım senaryolarında bile uygulamanızın çalışmaya devam etmesini garanti etmek açısından önemlidir.

///

Bu parametre o endpointi / path operation’ı oluşturmaz; fakat /token URLsinin client’ın token almak için kullanması gereken URL olduğunu bildirir. Bu bilgi OpenAPIde, dolayısıyla etkileşimli API dokümantasyon sistemlerinde kullanılır.

Birazdan gerçek path operation’ı da oluşturacağız.

/// note | Teknik Detaylar

Eğer çok katı bir "Pythonista" iseniz, token_url yerine tokenUrl şeklindeki parametre adlandırma stilini sevmeyebilirsiniz.

Bunun nedeni, OpenAPI spesifikasyonundaki isimle aynı adın kullanılmasıdır. Böylece bu güvenlik şemalarından herhangi biri hakkında daha fazla araştırma yapmanız gerekirse, adı kopyalayıp yapıştırarak kolayca daha fazla bilgi bulabilirsiniz.

///

oauth2_scheme değişkeni, OAuth2PasswordBearer’ın bir instance’ıdır; ama aynı zamanda "callable"dır.

Şu şekilde çağrılabilir:

oauth2_scheme(some, parameters)

Dolayısıyla Depends ile kullanılabilir.

Kullanın

Artık Depends ile bir dependency olarak oauth2_schemei geçebilirsiniz.

{* ../../docs_src/security/tutorial001_an_py310.py hl[12] *}

Bu dependency, path operation function içindeki token parametresine atanacak bir str sağlar.

FastAPI, bu dependencyyi OpenAPI şemasında (ve otomatik API dokümanlarında) bir "security scheme" tanımlamak için kullanabileceğini bilir.

/// note | Teknik Detaylar

FastAPI, bir dependency içinde tanımlanan OAuth2PasswordBearer sınıfını OpenAPIde security scheme tanımlamak için kullanabileceğini bilir; çünkü bu sınıf fastapi.security.oauth2.OAuth2den kalıtım alır, o da fastapi.security.base.SecurityBaseden kalıtım alır.

OpenAPI (ve otomatik API dokümanları) ile entegre olan tüm security araçları SecurityBaseden kalıtım alır; FastAPI bu sayede onları OpenAPIye nasıl entegre edeceğini anlayabilir.

///

Ne Yapar

Request içinde Authorization header’ını arar, değerin Bearer + bir token olup olmadığını kontrol eder ve token’ı str olarak döndürür.

Eğer Authorization header’ını görmezse ya da değer Bearer token’ı içermiyorsa, doğrudan 401 status code hatasıyla (UNAUTHORIZED) response döner.

Token’ın var olup olmadığını kontrol edip ayrıca hata döndürmenize bile gerek yoktur. Fonksiyonunuz çalışıyorsa, token içinde bir str olacağından emin olabilirsiniz.

Bunu şimdiden etkileşimli dokümanlarda deneyebilirsiniz:

Henüz token’ın geçerliliğini doğrulamıyoruz, ama başlangıç için bu bile yeterli.

Özet

Yani sadece 3 veya 4 ekstra satırla, şimdiden ilkel de olsa bir güvenlik katmanı elde etmiş oldunuz.