İçeriğe geç

Django Rest Framework JWT ile Kullanıcı Doğrulaması | JWT Authentication

Herkese merhabalar. Web uygulamalarında kullanıcı doğrulama işlemlerini muhtemelen defalarca tekrar etmişizdir. İstekte bulunan kullancının o işleme erişip erişemeyeceği, erişim izni alabilmesi için yönlendirme vs vs.

Django kendi içinde gelen auth uygulaması sayesinde bunu session bazlı olarak yönetmekte.

Fakat birden fazla client’a destek vermemiz gereken durumlarda (mobil uygulama,desktop uygulaması veya Vue,React tarzı bir JS frameworkü) oluşturacağınız REST API üzerinde ortak bir taban kullanmak gerekecektir. Bildiğiniz üzere HTTP protokolü kendi içinde bir kimlik doğrulama mekanizmasına sahiptir.

Token bazlı doğrulama da en fazla kullanılan yöntemler arasındadır.

Bu yöntemlerde kullanıcı, kullanıcı adı ve parolasını kullanarak sistemden bir token ister. Gönderilen kimlik bilgileri doğru ise ya bir token oluşturulur ya da eşleşen token döndürülür. Daha sonraki isteklerde token HTTP Authorization header’ına eklenerek doğrulama işlemi tamamlanmış olur.

Django Rest Framework yerleşik bir token bazlı kullanıcı doğrulama yeteneğine  sahiptir. Okumak isterseniz token bazlı doğrulama.

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


JWT nedir?

JSON Web Token (JWT), tarafların birbirleri arasındaki veri alışverişini ve bunun doğrulamasını sağlayan JSON tabanlı RFC 7519‘de tanımlanmış açık bir standarttır. Örneğin bir sunucu, kullanıcının yönetici ayrıcalıklarına sahip olduğunu belirten bir anahtar (token) oluşturabilir ve bunu kullanıcıya gönderebilir. Kullanıcı daha sonra bu anahtar ile kendisine tanımlanmış olan yönetici yetkisini bir istemcide kullanabilir ve bütün taraflar tarafından yetkisi doğrulanabilir.

Kısaca bakacak olursak birbirine . ile bağlanan 3 parçadan oluşur.

Header.

Token tipini ve oluşturulurken kullanılacak olan algoritmayı belirler. Örneğin.

Payload.

Token ve üzerinde tutulan bazı bilgileri içerir. Token geçerlilik süresi, kullanıcınının primary key’i gibi.

Signature.

İmza. Oluşturulabilmesi için base64 kodlu header, payload, header’da belirtilen algoritma türü ve secret_key’e ihtiyaç duyar. Token göndericisi ve veri tutarlılığı için kullanılır.

Not: Django ve JWT’leri oluştururken proje SECRET_KEY’ ini kullanır. Bu sebepten dolayı canlıya çıkarken SECRET_KEY ve diğer hassas bilgi taşıyacak settings değişkenlerini korumalısınız.

Tabii ki bu çok basit bir yaklaşım. Daha ayrıntılı bilgi için şu iki adrese gidebilirsiniz.

Jwt IO

Json Web Token JWT Standartı


Django ve JWT.

Django ile JWT çok kolay bir şekilde kullanılabilmekte. Kuruluma geçmeden önce senaryoyu özetleyecek olursak.

  • Kullanıcı kayıt olacak. (Yerleşik kullanıcı modeli baz alındı.)
  • Daha sonra kullanıcı adı ve parolası ile token isteği yapacak.
  • 2 tip token dönülecek. Access ve Refresh.
  • Access tokeni kullanıcının doğrulanması gereken kısımlarda kullanılacak ve kısa süreli olacak. Belirli bir süre sonra(örneğin 10 dakika) geçerliliğini yitirecek.
  • Refresh ise daha uzun ömürlü (örneğin 24 saat) olacak. Kullanıcı access tokenini yenilemek istediğinde kullanılacak.

Gerekli kütüphanenin kurulması.

Spesifik bir view üzerinden gidecek olursak söyle bir kullanım işimizi görecektir.

your_app/views.py

View için kullanılacak olan doğrulama tipi, ve bu view’a sadece doğrulanmış kullanıcıların erişebileceğini tanımladık.

your_app/urls.py

View ve url bağlantısından sonra deneme isteğini yollayalım.

Doğrulama başarısız. Ve gerekli olan doğrulama metodu döndürüldü. Tokene ihtiyacımız var.

Not: Shell üzerinden HTTP istekleri gönderirken curl fazlasıyla karmaşıklaşabiliyor. HTTPie bu işlemleri çok daha kolay yönetebilirsiniz.

Token isteği yapabilmek için url tanımlamalarını yapalım.

Token isteği yapalım!

Tokenleri elde ettik. Http header’ımıza tokeni ekleyip tekrar ulaşmaya çalışalım.

Doğrulama başarılı! Fakat tokenlerimizin süreleri olduğundan bahsetmiştik. Bu ayarlamalar için.

your_project/settings.py

Basitçe JWT tokenlerimizin geçerlilik sürelerini ayarlayalım. Token oluşturulduktan sonra 45 saniye kullanılabilsin ve bu süre sonunda yenilenmek zorunda olsun. Yenileme tokeni de 1 gün sonra geçerliliğini yitirsin. Herhangi bir tanımlama yapmaz iseniz bu süreler sırası ile 5 dakika ve 1 gündür. Bu ayarlamaların yanında bir çok farklı ayar daha yapabilirsiniz. Tokenin hangi algoritma ile oluşturulacağı, hangi secret_key ile kodlanacağı, payload’da bulunacak benzersiz kullanıcı bilgisi veya hangi isimle orada bulunacağı. Gerekli dökümantasyon.


O zaman yeni bir token isteği yapalım. 45 saniye bekleyip isteğimizi yapalım. Tokenimizin geçersiz olduğu cevabını bekliyoruz.

Token geçersiz o halde yenileyelim.

Tekrar tokeni elde ettikten sonra doğrulamayı sağlayabilirsiniz.

Ek olarak kullanıcının halihazırda elinde olan refresh tokenin doğruluğunu kontrol etmek isterseniz:

your_app/urls.py


Özet.

JWT ile kullanıcı doğrulaması görüldüğü üzere çok kolay bir işlem. Projenize bu özelliği ekledikten sonra tokenleri client tarafında saklayarak HTTP istemcinizi konfigüre edebilirsiniz. (Örneğin Vue.js ile geliştirilmiş bir uygulamada local storage)

Eğer shell HTTP istemcileri ile uğraşmak istemezseniz şöyle basit bir test yazabilirsiniz. Yeni görünümlü bloğun ilk yazısı olmuş olsun böylece. Görüşmek üzere!

your_app/tests.py

 

Tarih:Blog

İ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