Türkçe
  • oidc
  • supabase
  • auth
  • rls
  • jwt

Supabase ile Entegrasyon

Uygulamalarınızın kimlik doğrulama deneyimini geliştirmek için Logto'yu Supabase ile nasıl entegre edeceğinizi öğrenin.

Yijun
Yijun
Developer

Logto, uygulamalar için güvenli, kapsamlı ve kullanıcı dostu bir oturum açma desteği sunan modern bir kimlik doğrulama hizmeti sağlayıcısıdır. Ayrıca, birden fazla çerçeve ve programlama dili için birçok SDK ve entegrasyon kılavuzu sunar, bu sayede kurumsal düzeyde kimlik doğrulama hizmetlerini uygulamanıza dakikalar içinde sorunsuz bir şekilde entegre edebilirsiniz.

Bu makale çoğunlukla Logto'yu Supabase ile nasıl entegre edeceğinizi ayrıntılı olarak açıklamaya odaklanır.

Supabase Temelleri

Supabase, veri erişim izinlerini kontrol etmek için Postgres'in Satır Düzeyi Güvenlik özelliğini kullanır. Basitçe söylemek gerekirse, veritabanındaki tablolara Satır Düzeyi Güvenlik politikaları oluşturarak, bir tabloda kimin veri okuyabileceğini, yazabileceğini ve güncelleyebileceğini kısıtlayabilir ve yönetebilirsiniz.

Veritabanınızda "posts" adlı bir tablo bulunduğunu ve içeriğinin aşağıdaki gibi olduğunu varsayalım:

Posts tablosu

Tablodaki user_id alanı, her bir gönderi verisinin hangi kullanıcıya ait olduğunu temsil eder. Her kullanıcının sadece kendi gönderi verilerine erişimini user_id alanına göre kısıtlayabilirsiniz.

Ancak, bu uygulanmadan önce, Supabase'in veritabanına erişen mevcut kullanıcıyı tanımlayabilmesi gerekir.

Supabase İsteklerine Kullanıcı Verisi Ekleme

Supabase'in JWT desteği sayesinde, uygulamamız Supabase ile etkileşime geçtiğinde, Supabase tarafından sağlanan JWT sırrını kullanarak kullanıcı verilerini içeren bir JWT oluşturabiliriz. Bu JWT'yi istek yaparken Authentication başlığı olarak kullanırız. Supabase, isteği aldıktan sonra JWT'nin geçerliliğini otomatik olarak doğrular ve bu süreçler boyunca içinde bulunan verilere erişir.

Öncelikle, Supabase panosundaki “Proje Ayarları” bölümünden Supabase tarafından sağlanan JWT sırrını elde edebiliriz:

Supabase API ayarları sayfası

Daha sonra, Supabase SDK'sını kullanarak Supabase'e istek yaptığımızda, bu sırrı kullanarak JWT'mizi oluşturur ve isteğe Authentication başlığı olarak ekleriz. (Bu işlemin uygulamanızın arka uç hizmetinde gerçekleştiğini ve JWT sırrının üçüncü taraflara ifşa edilmemesi gerektiğini lütfen unutmayın).

Daha sonra, Supabase panosundaki SQL Editörüne gidin ve istekte taşınan userId'yi almak için bir fonksiyon oluşturun:

Kullanıcı Kİmlik Alma Fonksiyonu Oluştur

Yukarıdaki görüntüde kullanılan kod aşağıdaki gibidir:

Kodda gösterildiği gibi, Supabase'te oluşturduğumuz JWT'nin yükünü request.jwt.claims çağrısı ile elde edebilirsiniz. Yükün içerisindeki userId alanı, belirlediğimiz değerdir.

Bu fonksiyon ile Supabase, veritabanına erişen mevcut kullanıcıyı belirleyebilir.

Satır Düzeyinde Güvenlik Politikası Oluşturma

Şimdi, gönderiler tablosundaki user_id alanına dayalı olarak her kullanıcının yalnızca kendi gönderi verilerine erişimini kısıtlamak için bir Satır Düzeyinde Güvenlik politikası oluşturabiliriz.

  1. Supabase panosundaki Tablo Editörü sayfasına gidin ve gönderiler tablosunu seçin.
  2. Tablonun üst kısmında "RLS Politikası Ekle"ye tıklayın.
  3. Açılan pencerede "Politika Oluştur" düğmesine tıklayın.
  4. Bir Politika Adı girin ve SELECT Politika komutunu seçin.
  5. Aşağıdaki kodun using bloğuna şunu girin:
RLS politikası oluştur

Bu tür politikaları kullanarak Supabase içinde veri erişim kontrolü sağlanır.

Gerçek dünyadaki uygulamalarda kullanıcı eylemlerini, örneğin veri ekleme ve değiştirme gibi, kısıtlamak için çeşitli politikalar oluşturursunuz. Ancak, bu makalenin kapsamı bunun ötesindedir. Satır Düzeyi Güvenlik (RLS) hakkında daha fazla bilgi için Verilerinizi Postgres Satır Düzeyinde Güvenlik ile Koruyun kaynağına başvurabilirsiniz.

Logto ile Temel Entegrasyon Süreci

Daha önce de belirtildiği gibi, Supabase erişim kontrolü için RLS'yi kullandığından, Logto (veya başka herhangi bir kimlik doğrulama hizmeti) ile entegrasyonun anahtarı, yetkili kullanıcının kullanıcı kimliğini elde etmek ve bu kimliği Supabase'e göndermekten geçer. Tüm süreç aşağıdaki şemada yer almaktadır:

Bu süreç diyagramına dayanarak Logto'yu Supabase ile nasıl entegre edeceğinizi açıklayacağız.

Logto Entegrasyonu

Logto, çeşitli çerçeveler ve programlama dilleri için entegrasyon kılavuzları sunar.

Genellikle, bu çerçeveler ve diller ile oluşturulan uygulamalar Yerel uygulamalar, SPA'lar (tek sayfa uygulamaları), geleneksel web uygulamaları ve M2M (makineden-makineye) uygulamaları gibi kategorilere ayrılır. Projenize kullandığınız teknoloji yığınına göre Logto'yu entegre etmek için Logto hızlı başlangıçlar sayfasını ziyaret edebilirsiniz. Ardından, projenizin türüne göre Logto'yu projenize entegre etmek için aşağıdaki talimatları izleyin.

Yerel Uygulama veya SPA

Hem yerel uygulamalar hem de SPA'lar cihazınızda çalışır ve giriş yaptıktan sonra elde edilen kimlik bilgileri (erişim tokenı) cihazınızda yerel olarak depolanır.

Bu nedenle, uygulamanızı Supabase ile entegre ederken, her bir kullanıcının cihazında hassas bilgileri (Supabase JWT sırrı gibi) ifşa edemeyeceğinizden dolayı Supabase ile arka uç hizmetiniz aracılığıyla etkileşime geçmeniz gerekecektir.

SPA'nızı React ve Express kullanarak oluşturduğunuzu varsayalım. Logto React SDK Kılavuzu ile uygulamanızı başarıyla entegre etmişsinizdir (kodumuzdaki react örneğimize göz atabilirsiniz). Ayrıca, Node (Express) API'nizi Korumak belgesine göre, arka uç sunucunuza Logto erişim token doğrulamasını eklediniz.

Şimdi, Logto'dan alınan erişim tokenını kullanarak arka uç sunucunuzdan kullanıcı verilerini isteyeceksiniz:

Arka uç sunucunuzda, zaten oturum açmış kullanıcının kimliğini erişim tokenından middleware kullanarak çıkardınız:

Şimdi, yukarıda tanımladığımız getSupabaseClient 'ı kullanarak, userId'yi Supabase'e yapılacak sonraki isteklerde kullanılacak JWT'ye ekleyebilirsiniz. Alternatif olarak, Supabase ile etkileşimde bulunması gereken istekler için bir Supabase istemcisi oluşturmak için bir middleware oluşturabilirsiniz:

Sonraki işlem akışlarında, Supabase ile etkileşim kurmak için doğrudan ctx.supabase'i çağırabilirsiniz:

Bu kodda, Supabase, daha önce belirlenen politikalara göre yalnızca mevcut kullanıcıya ait gönderi verilerini döndürecektir.

Geleneksel Web Uygulaması

Geleneksel bir web uygulaması ile Yerel bir uygulama veya SPA arasındaki temel fark, geleneksel bir web uygulamasının sayfaları yalnızca web sunucusunda oluşturması ve güncellemesidir. Bu nedenle, kimlik bilgileri doğrudan web sunucusu tarafından yönetilir, oysa Yerel uygulamalar ve SPA'lar için bu bilgiler kullanıcının cihazında bulunur.

Supabase ile geleneksel bir web uygulamasını Logto ile entegre ederken, oturum açmış kullanıcının kimliğini doğrudan arka uçtan elde edebilirsiniz.

Bir Next.js projesini ele alalım, projenize Next.js SDK Kılavuzu takip ederek Logto'yu entegre ettikten sonra, Logto SDK'sını kullanarak kullanıcı bilgilerini alabilir ve Supabase ile etkileşimde bulunmak için ilgili JWT'yi oluşturabilirsiniz.

Makineden-Makineye Uygulama

Makineden-makineye (M2M) genellikle uygulamanızın doğrudan kaynak sunucularıyla iletişim kurması gerektiğinde kullanılır, örneğin günlük gönderileri çeken statik hizmetler vb.

Makineden-makineye uygulama kimlik doğrulaması için Makineden-makineye: Logto ile Kimlik Doğrulama kılavuzunu kullanabilirsiniz. Supabase ile Makineden-makineye uygulamalar arasındaki entegrasyon, Yerel uygulamalar ve SPA'lar ile olan entegrasyon ("Yerel uygulama veya tek sayfa uygulaması" bölümünde açıklandığı gibi) ile benzerdir. Bu işlem, Logto'dan bir erişim tokenı aldıktan sonra, bu tokenın korunan bir arka uç API'si aracılığıyla doğrulama işlemini içerir.

Ancak, Yerel uygulamalar ve SPA'lar genellikle son kullanıcılar için tasarlandığından, elde edilen kullanıcı kimliği doğrudan kullanıcıyı temsil eder. Ancak, makineden-makineye uygulamaları için verilen erişim tokenı, uygulamanın kendisini temsil eder ve token yükündeki sub alanı, M2M uygulamasının istemci kimliğidir, belirli bir kullanıcı değil. Bu nedenle, geliştirme sırasında hangi verilerin M2M uygulamaları için tasarlandığını ayırt etmek önemlidir.

Dahası, belirli bir M2M uygulamasının Supabase'e tüm hizmet adına erişim sağlayarak RLS kısıtlamalarını atlamasını istiyorsanız, Supabase'in service_role sırrını kullanarak bir Supabase istemcisi oluşturabilirsiniz. Bu, sıradan kullanıcılar için belirlenen Satır Düzeyi Güvenlik politikalarından etkilenmeden tüm verilere erişimi gerektiren bazı idari veya otomatik görevleri yerine getirmek istediğinizde kullanışlıdır.

Service_role sırrı, JWT sırrını bulduğunuz sayfada bulunabilir:

Service role sırrı

Bir Supabase istemcisi oluştururken, bu istemciyi veritabanındaki tüm verilere erişim sağlayabilecek şekilde service_role sırrını kullanın:

Özet

Bu makalede, Logto'yu Supabase ile entegre etmeyi derinlemesine inceledik ve önemli entegrasyon noktalarına değindik. JWT kimlik doğrulama ve Satır Düzeyi Güvenlik politikaları gibi kavramları keşfederek, Logto'yu Supabase destekli uygulamalarınıza sorunsuz bir şekilde nasıl entegre edeceğinizi adım adım açıkladık. Bu bilgilerle, uygulamanızın güvenliğini, işlevselliğini ve hatta projelerinizi ek özelliklerle genişletme noktasında kendinize güvenebilir hale gelmenizi umuyoruz.