Yetkilendirmeyi artırmak için JWT erişim belirteçleri için özel iddialar ekleyin
Bu makalede, yetkilendirmenin esnekliğini ve hizmet sağlayıcının performansını iyileştirmek için Logto özel JWT iddiaları özelliğini kullanmayı tanıtacağız. Gerçek dünyadan bir örnekle bunu açıklayacağız.
Önceki makalelerde, giderek daha fazla sistemin kullanıcı kimlik doğrulaması ve erişim kontrolü için JWT formatında erişim belirteçleri kullandığını belirtmiştik. Bunun önemli nedenlerinden biri, JWT'nin kullanıcı rolleri ve izinleri gibi bazı yararlı bilgileri içerebilmesidir. Bu bilgiler, sunucu ile istemci arasında kullanıcı kimlik bilgilerini iletmemize yardımcı olabilir ve böylece kullanıcı kimlik doğrulaması ve erişim kontrolü sağlanabilir.
Genellikle JWT'de yer alan bilgiler, kimlik doğrulama sunucusu tarafından belirlenir. OAuth 2.0 protokolüne göre, JWT genellikle sub
(konu), aud
(hedef kitle) ve exp
(son kullanma süresi) gibi alanları içerir ve bunlar iddialar olarak adlandırılır. Bu iddialar, erişim belirtecinin geçerliliğini doğrulamaya yardımcı olabilir.
Ancak, JWT'nin doğrulama için kullanıldığı sayısız senaryo vardır ve yaygın JWT iddiaları genellikle kullanıcı ihtiyaçlarını karşılayamayabilir. İnsanlar genellikle JWT'nin bazı bilgileri içerebildiğini düşündüğünden, yetkilendirmeyi kolaylaştırmak için ona bazı bilgiler ekleyebilir miyiz diye düşünür.
Cevap EVET, JWT'ye mevcut kullanıcının kapsamı ve abonelik seviyesi gibi özel iddialar ekleyebiliriz. Bu şekilde, kullanıcı kimlik bilgilerini istemci ile sunucu arasında (burada çeşitli farklı hizmetler sağlayan sunucu, diğer adıyla hizmet sağlayıcı) iletebilir ve kullanıcı kimlik doğrulaması ve erişim kontrolü sağlayabiliriz.
Standart JWT iddiaları hakkında daha fazla bilgi için RFC7519 rehberine başvurabilirsiniz. Hem kimlik doğrulama hem de yetkilendirme desteği sağlayan bir kimlik çözümü olarak Logto, bu temelde kaynak ve kapsam iddialar ını genişleterek standart RBAC desteği sunar. Logto'nun RBAC uygulaması standarttır, ancak tüm kullanım durumlarına uygun olacak kadar basit ve esnek değildir.
Buna dayanarak, Logto, kullanıcıların ek JWT iddialarını özelleştirebileceği yeni bir özellik olan JWT iddialarını özelleştirme özelliğini başlattı, böylece kullanıcı kimlik doğrulaması ve erişim kontrolü daha esnek bir şekilde uygulanabilir.
Logto özel JWT iddiaları nasıl çalışır?
Kenar çubuğundaki "JWT iddiaları" düğmesine tıklayarak Özel JWT listeleme sayfasına erişebilirsiniz.
Son kullanıcılar için özel iddialar eklemeye başlamadan önce.
Soldaki editörde getCustomJwtClaims
fonksiyonunuzu özelleştirebilirsiniz. Bu metodun üç giriş parametresi vardır: token
, data
ve envVariables
.
token
, mevcut son kullanıcının kimlik bilgilerine ve sistem yapılandırmanıza dayanarak elde edilen ham erişim belirteci yükü ve Logto'daki kullanıcının erişimle ilgili bilgileridir.data
, Logto'daki kullanıcıyla ilgili tüm bilgileri içerir; tüm kullanıcı rolleri, sosyal oturum açma kimlikleri, SSO kimlikleri, organizasyon üyelikleri vb.envVariables
, Logto'daki mevcut son kullanıcı erişim belirteci kullanım senaryosu için yapılandırdığınız ortam değişkenleridir; örneğin, gerekli dış API'lerin API anahtarı/anahtarları vb.
Sağdaki kartlar genişletilebilir ve ilgili parametrelerin tanıtımını gösterebilir, ayrıca mevcut senaryo için ortam değişkenlerini burada ayarlayabilirsiniz.
Sağdaki tüm kartların tanıtımlarını okuduktan sonra test moduna geçebilirsiniz; burada test verilerini düzenleyebilir ve yazdığınız betiğin soldaki kod editöründe beklentilerinizi karşılayıp karşılamadığını kontrol etmek için düzenlenen test verilerini kullanabilirsiniz.
Bu, bir son kullanıcı Logto'ya kimlik doğrulama isteği başlattığında ve sonunda Logto tarafından döndürülen JWT formatında erişim belirteci elde ettiğinde, getCustomJwtClaims
fonksiyonunun yürütme sürecini gösteren bir sıra diyagramıdır.
Özel JWT özelliği etkin değilse, şekil 3'teki adım atlanacak ve 2. adımın bitiminden hemen sonra 4. adım yürütülecektir. Bu durumda, Logto, getCustomJwtClaims
'in geri dönüş değerini boş bir nesne olarak varsayacak ve ardından sonraki adımlara devam edecektir.
Özel JWT iddiaları ile yetkilendirmeyi artırın: pratik bir örnek
Önceki bölümde, Logto özel JWT'sinin çalışma prensibini tanıttık. Bu bölümde, Logto özel JWT iddialarını kullanarak yetkilendirme esnekliğini ve hizmet sağlayıcının performansını gerçek dünya örneği aracılığıyla nasıl artırabileceğinizi göstereceğiz.
Senaryo kurulumu
John'un ekibi, kullanıcıların AI robotlarıyla çeşitli hizmetler almak için konuşmasına olanak tanıyan bir AI Yardımcı Uygulaması geliştirdi.
AI robot hizmetleri ücretsiz ve ücretli hizmetler olarak ayrılır. Ücretsiz hizmetler arasında özel uçak bileti teklifleri yer alırken, ücretli hizmetler arasında borsa tahminleri bulunur.
AI Yardımcı Uygulaması, tüm kullanıcıları yönetmek için Logto kullanır ve bu kullanıcılar ücretsiz kullanıcılar, ön-ödemeli kullanıcılar ve premium kullanıcılar olarak üç tipe ayrılır. Ücretsiz kullanıcılar yalnızca ücretsiz hizmetleri kullanabilir, ön-ödemeli kullanıcılar tüm hizmetleri kullanabilir (kullanım başına ücretlendirilir), ve premium kullanıcılar tüm hizmetleri kullanabilir ancak kötü amaçlı kullanımı önlemek için hız sınırları vardır.
Ayrıca, AI Yardımcı Uygulaması, kullanıcı ödemelerini yönetmek için Stripe kullanır ve kullanıcı işlem günlüklerini kaydetmek için kendi günlük hizmetine sahiptir.
Logto yapılandırmaları
İlk olarak, AI Yardımcı Uygulama hizmeti için API kaynakları oluşturuyoruz ve iki kapsam oluşturuyoruz: recommend:flight
ve predict:stock
.
Daha sonra iki rol
, free-user
ve paid-user
oluşturuyoruz ve ilgili kapsamları atıyoruz:
recommend:flight
kapsamınıfree-user
rolüne atayın.- Hem
recommend:flight
hem depredict:stock
kapsamlarınıpaid-user
rolüne atayın.
Son olarak, free-user
, prepaid-user
ve premium-user
olmak üzere üç kullanıcı oluşturuyoruz ve ilgili rolleri atıyoruz:
free-user
rolünüfree-user
kullanıcısına atayın.paid-user
rolünüprepaid-user
vepremium-user
kullanıcılarına atayın.
Aşağıdaki şekilde gösterildiği gibi, yukarıda belirtilen senaryo için gerekli olan yetkilendirme bilgilerini uygulamak amacıyla, geçerli oturum açmış kullanıcının JWT'de roles
, balance
ve numOfCallsToday
bilgilerini içermesini istiyoruz. AI Yardımcı Uygulamasında erişim belirtecini doğrularken, bu bilgiler hızlıca yetkilendirme doğrulaması yapmak için kullanılabilir.
envVariables
'i yapılandırdıktan sonra, getCustomJwtClaims
fonksiyonunu uygular ve "Testi Çalıştır" düğmesine tıklayarak mevcut test verilerine dayalı olarak ek JWT iddialarının sonucunu görebilirsiniz.
data.user.roles
için test verilerini yapılandırmadığımız için, sonuçta gösterilen roles
boş bir dizidir.
Özel JWT özelliğinin devreye girip girmediğini kontrol edin
Yukarıdaki Logto yapılandırmasına göre, testte karşılık gelen sonuçları aldık. Sıradaki adımda, Logto'nun sağladığı örnek uygulamayı kullanarak özel JWT'mizin etkili olup olmadığını doğrulayacağız. Logto SDK'larında aşina olduğunuz SDK'yı bulun ve dokümantasyon ile ilgili GitHub deposuna göre bir örnek uygulama dağıtın.
Yukarıda açıkladığımız yapılandırmaya dayanarak, React SDK'sını bir örnek olarak ele aldığımızda, LogtoConfig içindeki ilgili yapılandırmayı aşağıdaki gibi güncellememiz gerekir:
AI Yardımcı Uygulamasını simüle eden örnek uygulamaya free_user
kullanıcısını giriş yaptıktan sonra, JWT erişim belirtecinin yük kısmını inceleyerek eklediğimiz roles
, balance
, numOfCallsToday
, isPaidUser
ve isPremiumUser
bilgilerinin görüntülenebileceğini görebilirsiniz.
balance
, numOfCallsToday
, isPaidUser
ve isPremiumUser
değerleri önceki teste uygundur ve roles
["free-user"]
'a eşittir. Bunun nedeni, gerçek son kullanıcı oturum açma sürecinde, kullanıcının kullanılabilir tüm verilerini elde edip bunları uygun şekilde işlememizdir.
Premium kullanıcılar için, roles
'ın ["paid-user"]
olduğunu ve hem isPaidUser
hem de isPremiumUser
'ın true
olduğunu görebiliyoruz.
Hizmet sağlayıcının yetkilendirme mantığını güncelleyin
Önceki adımlarda, iş ihtiyaçlarına dayalı olarak kullanıcı erişim belirtecine özel iddialar ekledik. Sıradaki adımımız, bu iddiaları kullanarak hızlı bir şekilde yetkilendirme doğrulaması yapmaktır.
Burada Logto'nun API tarafında JWT erişim belirteçlerini doğrulama mantığını sağlıyoruz. Tam kod uygulaması GitHub deposunda bulunabilir:
Logto API'de erişim belirteçlerini doğrulama mantığını referans alabilir ve bunu kendi iş mantığınıza göre özelleştirebilirsiniz. Örneğin, burada açıklanan AI Yardımcı Uygulama senaryosu için verifyBearerTokenFromRequest
fonksiyonuna roles
, balance
, numOfCallsToday
, isPaidUser
ve isPremiumUser
gibi özel iddiaların doğrulama mantığını ekleyebilirsiniz.
Yukarıdaki örnek, son kullanıcının oturum açmasını ve JWT erişim belirteci almasını etkileyen senaryolar içindir. Kullanım durumunuz makineden makineye (M2M) ise, M2M uygulamaları için özel JWT iddialarını ayrı ayrı yapılandırabilirsiniz.
Kullanıcılar için özel JWT yapılandırmak, M2M uygulamalarının erişim belirteçlerini elde etme sonucunu etkilemez ve bunun tersi de geçerlidir.
M2M bağlantılarının genelliği nedeniyle, Logto şimdilik M2M uygulamalarının getCustomJwtClaims
yöntemini Logto'dan gelen dahili verileri kabul edebilmesi işlevini sunmamaktadır. Diğer yönlerden, M2M uygulamaları için özel JWT yapılandırma yöntemi, kullanıcı uygulamalarına benzerdir. Bu makalede detaylandırılmayacaktır. Logto'nun özel JWT işlevini kullanarak başlayabilirsiniz.
Neden özel JWT iddiaları kullanmalısınız?
John için AI Yardımcı Uygulama senaryosunu ve Logto'nun Özel JWT özelliğini kullanarak daha esnek yetkilendirme doğrulaması yapmayı sağlama yolunu sunduk. Bu süreçte, Özel JWT özelliğinin avantajlarını görebilirsiniz:
- Özel JWT özelliği olmadan, kullanıcılar her yetkiyi kontrol ederken bir dış API'ye (örn.
getCustomJwtClaims
'te yaptığınız gibi) talepte bulunmaları gerekir. Bu API'yi sağlayan hizmet sağlayıcı için, bu ek bir yük getirebilir. Özel JWT özelliği ile bu bilgiler doğrudan JWT'ye koyulabilir, böylece dış API'ye yapılan sık çağrılar azaltılabilir. - Hizmet sağlayıcılar için, Özel JWT özelliği, kullanıcı yetkilerinin daha hızlı doğrulanmasını sağlar, özellikle istemci hizmet sağlayıcıya sıkça arama yaptığında, hizmet performansını artırır.
- Özel JWT özelliği, işletmenin gerektirdiği ek yetkilendirme bilgilerini hızlıca uygulamanızı sağlar ve JWT kendi kendine yeterli olduğundan ve şifrelenebileceği için bilgilerin istemci ve hizmet sağlayıcı arasında güvenli bir şekilde iletilmesini sağlar, dolayısıyla sahtekarlık yapması zorlaşır.
Aynı zamanda, getCustomJwtClaims
, bir kullanıcıya Logto'nun erişim belirteci oluşturması gerektiğinde her seferinde çalıştırıldığından aşırı karmaşık mantık çalıştırmaktan ve yüksek bant genişliği gereksinimleri ile dış API isteklerinden kaçınılması gerekmektedir. Aksi takdirde, son kullanıcıların oturum açma sürecinde getCustomJwtClaims
sonucunu beklemeleri çok uzun sürebilir. getCustomJwtClaims
boş bir nesne döndürüyorsa, bu yapılandırma öğesini gerçekten kullanmanız gerekene kadar geçici olarak silmenizi şiddetle öneririz.
Sonuç
Bu makalede, Logto, temel JWT erişim belirtecini genişletti ve kullanıcıların işletme gereksinimlerine göre JWT erişim belirtecine ek son kullanıcı bilgileri koymalarına olanak tanıyan ekstra JWT iddiaları işlevini genişletti, böylece kullanıcı oturum açtıktan sonra kullanıcı yetkileri hızla doğrulanabilir.
John'un AI Yardımcı Uygulama senaryosunu sunduk ve Logto'nun Özel JWT özelliğini kullanarak daha esnek yetkilendirme doğrulaması yapmayı sağlama yolunu gösterdik. Ayrıca, özel JWT kullanmanın bazı önemli noktalarını belirttik. Gerçek işletme senaryolarıyla birleştiğinde, kullanıcılar işletme ihtiyaçlarına göre çeşitli kullanıcıyla ilgili bilgileri JWT erişim belirtecine koyabilir, böylece hizmet sağlayıcı kullanıcı yetkilerini hızla doğrulayabilir.