İçeriğe geç

Django Rest Framework ile Token Bazlı Kullanıcı Doğrulaması Nasıl Yapılır?

Herkese merhabalar.

Web uygulamalarının ayrılmaz parçalarından biride kullanıcı doğrulaması yaparak isteği yapan kullanıcının yapmak istediği işleme erişimi olup olmamasını kontrol edip, isteğini reddetmek ya da erişim izni alabilmesi için yönlendirmektir.

Böylece erişimi sınırlandırmış olur ve uygulamamızda daha güvenli bir yapı kurmuş oluruz.


Uygulamanızın birden fazla istemci (mobil uygulama,masaüstü uygulaması vs) ile çalışması gerekiyorsa  burada çalışılabilecek ortak bir taban bulmak daha mantıklı olacaktır.


HTTP Authentication

HTTP protokolü gelen isteklerde kullanıcı doğrulaması yapmak üzere bir mekanizmaya sahiptir. Server gelen isteğin Authorization Header’ını kontrol eder, eksik veya yanlış bilgi var ise 401 Unauthorized  ve desteklediği doğrulama tipini WWW-Authentication header’ı ile kullanıcıyı dönüp bilgilendirir.


Django Rest Framework’de yerleşik olarak 4 farklı kullanıcı doğrulama yöntemi bulunmaktadır.

  • Basic HTTP authentication.
  • Session authentication. (Doğrulama yönetimi Django tarafından yapılır.)
  • Token Authentication.
  • Remote user authentication.

Biz bu yazıda Token authentication üzerinden konuşacağız.


Sanal ortamı aktif edelim ve bağımlılıkları yükleyelim.

Daha sonra projemizi oluşturalım ve hesap yönetimi için bir uygulama oluşturalım.

example/settings.py


Değişiklerimizi migrate etmeden önce Rest Framework Auth Token hakkında konuşalım.

Çalışma mantığı.

Rest framework ile birlikte gelen token authentication’un çalışma mantığı aslında gayet basit.

Her kullanıcı’nın OneToOne ile bağlandığı bir Token modeli bulunmakta. Bu modele kullanıcıların token’ları ve oluşturulma zamanları kaydedilmekte.

Kullancı tokenini elde etmek için istek yaptığında kullanıcı adı ve paroladan oluşan bir serializer sizden veri beklemekte. Veriler alınıp servere POST edildiğinde ilk önce böyle bir kullanıcının gönderdiği veri ile uyuşan bir kullancı olup olmadığı kontrol edilmekte. Eğer kullancı var ise ve token’a sahip değilse oluşturulup, sahipse direkt olarak token dönülmekte. Bu dönen token daha sonra geliştirme yaptığınız istemci tarafında bir alanda saklanıp (örneğin Js frontend frameworkleri için tarayıcının LocalStorage’ı) yapılacak her isteğin HTTP Authorization header‘ına  eklenmekte ve doğrulama yapılmış olmakta.


Basit bir view yazıp kontrol etmek.

accounts/views.py

/api/ isteklerini accounts/urls.py araması gerektiğini söyleyelim.

example/urls.py

accounts/urls.py dosyasını oluşturun ve şu satırları ekleyin.

Tamam ise serveri koşturun.

Django size uygulanmamış migration’larınız olduğunu söyleyecektir. Pas geçin.

Daha sonra komut satırını açıp HTTP istemciniz ile istek yapın. Ben Httpie kullanıyorum. Curl ‘ de aynı işi görür 🙂

Şimdi de view’ımızı doğrulanmamış kullancılara kapatalım.

Şu 2 sınfı import edip

ExampleView’ı şu hale getirin.

Ve aynı isteği tekrarlayın.

Kimlik doğrulama bilgilerinin verilmediğini söyledi. Ve talep ettiği doğrulamayı belirtti. Tamam görünüyor!


Eğer projenizin başında iseniz kullancı her kayıt olduğunda otomatik olarak Token oluşturmak akıllıca olabilir.

Bu yüzden bizim için her kayıtta otomatik bir token oluşturan bir sinyal yazacağız.

/accounts/signals.py

/accounts/apps.py

Uygulamamız hazır olduğunda sinyalleri içeri aktarmasını belirtiyoruz.

Daha sonra ufak bir test yazacağız ve başarılı ise migration’larımızı veritabanına işleyeceğiz. I love Test Driven Development!

/accounts/tests.py

Ufak bir Django testi ile kurulumda bir kullanıcı oluşturuyoruz.  Daha sonra bu kullanıcının tokeni oluşturuldu mu oluşturulduysa doğru mu kontrollerini yapıyoruz.

Daha sonra şu komutu çalıştırıyoruz.

Her şey yolunda ise artık aşağıdaki iki komutu arka arkaya koşturup veritabanına değişiklikleri işliyoruz.


Son bir adım olarak kullanıcının server’den kendi tokenını’ istemesi kaldı.

Bu iş için Rest Framework Auth Token uygulamasının bir hazır bir view’ı var. Onu kullanacağız. Tabi ki override ederek kişiselleştirebilirsiniz 🙂

/accounts/urls.py

Dosyanın  son halinin böyle gözükmesi gerekmekte. Kullanacağımız view’ı import edip bir url’e bağladık. app_name bizim için Django içinde yapabileceğimiz named views çağrılarında karışıklıkların önüne geçmek için bir prefix olarak kullanılacak ve path’de geçmiş olduğumuz name değişkeni ile birleşecek. Örneğin( accounts:example, accounts:obtain-token)


Biraz daha test 🙂

İlk olarak kullanıcı tokenini isteyebilmeli ve daha sonra HTTP header’ına bu tokeni ekleyip bizim ExampleView’ımızı görebilmeli.

accounts/tests.py

Kısa olması açısından importları iç içe aldım. Önce bir client oluşturun daha sonra ilk testde oluşturmuş olduğumuz kullanıcı bilgilerini bir payload haline getirdik. Ve post isteği attık. Dönen değerin doğru olduğunu teyit ettikten sonra HTTP Authorization header’ına ekleyin ve ExampleView’ a istek attık. Artık doğrulandığımız için bize izin vermesi gerekmekte.

 

ile testleri çalıştırın.


Shell ile kullanım.

komutu ile bir kullanıcı oluşturun.

Token isteği için

Tokenimizi elde ettik.

Ve header’ımıza ekleyip ExampleView’ı tekrarladık. Cevap 200 🙂

Toplayacak olursak.

Testlerdi sinyallerdi derken bayağı uzun bir yazı oldu böyle tasarlamamıştım kafamda 🙂

Fakat artık Django Rest Framework ile token bazlı doğrulamanın nasıl yapılabileceğini biliyorsunuz. Bu kullanım gayet hızlı entegre edilebiliyor fakat tabii ki eksileri var her doğrulama işlemi için veritabanına dokunmak zorundasınız. Burada değinilmedi fakat admin panelinde tokenlerinizi görebilirsiniz. Bu admin panelinden yönetilebilecekleri anlamına geliyor.

Son olarak JSON Web Token’ler ile bu işlemi nasıl gerçekleştirebiliriz. Bununla ilgili bir yazıda yazacağım. Görüşmek üzere!

 

 

 

 

Tarih:BlogPython

İlk Yorumu Siz Yapın

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Göster
Gizle