Türkçe
  • özel JWT
  • JWT iddiaları
  • yetkilendirme
  • kimlik doğrulama
  • OAuth 2.0
  • Logto

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.

Darcy Ye
Darcy Ye
Developer

Ö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.

Özel JWT listeleme sayfası

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.
detay sayfası kullanıcı verileri

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.

detay sayfası kullanıcı testi

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.

AI yardımcı uygulama kaynağı

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 de predict:stock kapsamlarını paid-user rolüne atayın.
ücretsiz kullanıcı rolü
ücretli kullanıcı rolü

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 ve premium-user kullanıcılarına atayın.
ücretsiz kullanıcı rolü atama
ücretli kullanıcı rolü atama

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.

özel JWT iddialarını test etme

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.

örnek uygulama erişim belirteci önizleme-free

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.

örnek uygulama erişim belirteci önizleme-premium

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:

  1. Ö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.
  2. 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.
  3. Ö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.