Türkçe
  • oauth
  • jwt
  • api
  • güvenlik
  • kimlik doğrulama
  • yetkilendirme
  • makine-ile-makine

Makine-ile-makine iletişimi için API kaynaklarınızı güvenceye alın

Makine-ile-makine iletişimi için API kaynaklarınızı güvence altına almak amacıyla OAuth 2.0 ve JWT'yi nasıl kullanabileceğinizi öğrenin.

Gao
Gao
Founder

Birden fazla hizmet içeren bir proje oluştururken, API kaynaklarının güvenliği kritik bir endişe kaynağıdır. Bu makalede, hizmetler (makine-ile-makine) arasındaki iletişimi güvence altına almak için OAuth 2.0 ve JWT'yi nasıl kullanabileceğinizi ve minimum ayrıcalık ilkesine uymak için rol tabanlı erişim kontrolünü (RBAC) nasıl uygulayabileceğinizi göstereceğim.

Başlarken

Takip etmeniz için aşağıdaki ön koşullara sahip olduğunuzu varsayıyorum:

  • Bir Logto Cloud hesabı veya kendi barındırdığınız bir Logto örneği
  • Birbiriyle iletişim kurması gereken en az iki hizmet

Örnek olarak, şu hizmetlere sahip olduğumuzu varsayalım:

  • Alışveriş sepetlerini yönetmek için API'lar sağlayan bir alışveriş sepeti hizmeti
    • Uç Nokta: https://cart.example.com/api
  • Ödemeleri işlemek için API'lar sağlayan bir ödeme hizmeti
    • Uç Nokta: https://payment.example.com/api

Kimlik Doğrulama Akışı

Şimdi, sepet hizmetimizin ödemeleri işlemek için ödeme hizmetiyle iletişim kurması gerekiyor. Kimlik doğrulama akışı şu şekildedir:

Yukarıdaki diyagramda bazı anahtar kavramlar:

  • JWT (RFC 7519): JSON Web Token. JWT'ye giriş için önceki makalemizi görün.
  • JWK (RFC 7517): Bir JWT'nin imzasını doğrulamak için kullanılan JSON Web Key. Bir JWK seti, bir dizi JWK'dan oluşur.
  • "client_credentials" izni (RFC 6749): OAuth 2.0'daki bir izin türü. Erişim token'ı almak için istemcinin kimlik bilgilerini kullanır. Detaylarını bir sonraki bölümlerde göstereceğiz.

Yukarıdaki diyagramdaki her katılımcının kimlik doğrulama akışında bir rolü vardır:

  • Sepet hizmeti: Ödeme hizmetini çağırması gereken istemci. Bir hizmet olmasına rağmen, OAuth 2.0 bağlamında hala bir istemcidir ve bu tür istemcilere Logto'da "makine-ile-makine uygulamaları" diyoruz.
  • Logto: Erişim token'ı veren OAuth 2.0 yetkilendirme sunucusu.
  • Ödeme hizmeti: Ödemeleri işlemek için API'lar sağlayan API kaynağı.

Kimlik doğrulama akışını adım adım inceleyelim.

İlk kurulum

Kimlik doğrulama akışını gerçekleştirmek için Logto'da bir makine-ile-makine uygulaması (sepet hizmeti) ve bir API kaynağı (ödeme hizmeti) oluşturmamız gerekiyor.

API kaynağı oluşturun

Sepet hizmetimiz, kimlik doğrulama gerçekleştirirken ödeme hizmetinin API'sinden haberdar olması gerektiğinden, önce bir API kaynağı oluşturmamız gerekiyor. Logto Console'a gidin, sol kenar çubuğunda API kaynakları'na tıklayın ve API kaynağı oluştur'a tıklayın. Açılan diyalogda, başlamanıza yardımcı olacak bazı eğitimler sunuyoruz. Ayrıca eğitimi atlamak için Eğitim olmadan devam et'e tıklayabilirsiniz.

API adını ve tanımlayıcısını girin, örneğin, Ödeme hizmeti ve https://payment.example.com/api, ardından API kaynağı oluştur'a tıklayın.

API kaynağını oluşturduktan sonra, detay sayfasına yönlendirileceksiniz. Şimdilik olduğu gibi bırakabiliriz.

Makine-ile-makine uygulaması oluşturun

Sol kenar çubuğunda Uygulamalar'a tıklayın ve Uygulama oluştur'a tıklayın. Açılan diyalogda, Makine-ile-makine kartını bulun ve ardından Başlamaya başla'ya tıklayın.

Uygulama adını girin, örneğin, Sepet hizmeti, ve Uygulama oluştur'a tıklayın. Uygulamayı kurmanıza yardımcı olacak interaktif bir rehber gösterilecektir. Rehberi takip ederek temel kullanımı anlayabilir veya Bitir ve tamamla'ya tıklayarak atlayabilirsiniz.

Erişim token'ı isteyin

Makine-ile-makine uygulamaları güvenli olduğu varsayıldığı için (örn. özel bir ağa dağıtılırlar), OAuth 2.0 "client_credentials" iznini kullanarak bir erişim token'ı alabiliriz. İstemciyi kimlik doğrulamak için temel kimlik doğrulama kullanır:

  • İstek URL'si, Logto örneğinizin token uç noktasıdır. Makine-ile-makine uygulama detayları sayfasının Gelişmiş ayarlar sekmesinde bulabilir ve kopyalayabilirsiniz.
  • İstek yöntemi POST'tur.
  • İstek Content-Type başlığı application/x-www-form-urlencoded'dir.
  • Authorization başlığı için değer Basic <base64(app_id:app_secret)>'dir, burada app_id ve app_secret, makine-ile-makine uygulamasının uygulama kimliği ve uygulama sırrıdır. Bunları uygulama detayları sayfasında bulabilirsiniz.
  • İstek gövdesi, izin türünü ve API tanımlayıcısını belirtmelidir. Örneğin, grant_type=client_credentials&resource=https://payment.example.com/api.
    • grant_type=client_credentials: "client_credentials" izni için sabit değer.
    • resource=https://payment.example.com/api: İstemcinin erişmek istediği API kaynağının API tanımlayıcısı.
    • Uygulamanın yetkilendirilmesi gereken kapsamlar (izinler) varsa, istek gövdesinde kapsamları da belirtebilirsiniz. Örneğin, scope=read:payment write:payment. Kapsamları daha sonra ele alacağız.

curl kullanarak bir istek örneği:

Başarılı bir yanıt gövdesi şöyle olabilir:

Yetkilendirme başlığı ile istek gönder

Şimdi bir erişim token'ımız var ve bunu API kaynağına yapılan isteğin Yetkilendirme başlığına ekleyebiliriz. Örneğin, ödeme hizmetinin POST /payments API'sini çağırmak istiyorsak, aşağıdaki isteği gönderebiliriz:

JWT'yi Doğrula

Ödeme hizmetinin JWT'yi JWK setini kullanarak doğrulaması gerektiğini ve her seferinde Logto'dan JWK setini getirmekten kaçınmak için yerel bir JWK set önbelleğine sahip olabileceğini fark etmiş olabilirsiniz. Neyse ki, JWT'nin popülaritesi sayesinde, bu hedefe birkaç satır kodla ulaşmanıza yardımcı olabilecek birçok kütüphane bulunmaktadır.

Bu kütüphaneler genellikle "jose" (JavaScript Object Signing and Encryption) veya "jsonwebtoken" olarak adlandırılır. Örneğin, Node.js'de jose'yi kullanarak JWT'yi doğrulayabiliriz:

Doğrulama başarılı olursa, payload değişkeni çözülen JWT yükü olur. Aksi takdirde, bir hata fırlatılır.

Rol Tabanlı Erişim Kontrolünü Uygula

Artık sepet hizmeti ile ödeme hizmeti arasındaki iletişimi başarıyla güvence altına aldık. Ancak, kimlik doğrulama akışı sadece istemcinin gerçek sepet hizmeti olduğundan emin olur ve sepet hizmetinin ödeme hizmetinde herhangi bir işlem yapma iznine sahip olduğundan emin olmaz.

Diyelim ki sepet hizmetine ödemeler oluşturma yetkisi vermek istiyoruz ama ödemeleri okuma yetkisi vermek istemiyoruz.

İzinleri Tanımlayın

Logto'da "kapsamlar" ve "izinler" değiştirilebilir. Ödeme hizmetinin API kaynağı detayları sayfasına gidin ve İzinler sekmesine gidin. Şu anda boş olmalıdır. İzin oluştur'a tıklayın, izin adı olarak read:payment, izin açıklaması olarak Ödemeleri oku girin. Ardından İzin oluştur'a tıklayın.

Yukarıdaki adımları tekrarlayarak ad olarak write:payment, açıklama olarak Ödemeler oluştur bir izin daha oluşturun.

Makine-ile-makine rolü oluşturun

Bir rol, bir grup izin grubudur. Logto'da makine-ile-makine uygulamalarına izin vermek için roller atanabilir. Sol kenar çubuğunda "Roller"'e tıklayın ve Rol oluştur'a tıklayın.

  1. Rol adı olarak checkout, rol açıklaması olarak Çıkış hizmeti girin.
  2. Daha fazla seçenek göster'e tıklayın. Rol türü olarak "Makine-ile-makine uygulama rolü" seçin.
  3. "Atanan izinler" bölümünde, API kaynak adı (Ödeme hizmeti) solundaki ok simgesine tıklayın ve write:payment iznini seçin.
    Rol oluştur
  4. Rol oluştur'a tıklayın.
  5. Zaten bir makine-ile-makine uygulamamız olduğu için (Sepet hizmeti), bir sonraki adımda role doğrudan atayabiliriz. Uygulama adı solundaki onay kutusunu işaretleyin (Sepet hizmeti) ve Uygulamaları ata'ya tıklayın.
Uygulamaya rol ata

Kapsamlarla erişim token'ı isteyin

Erişim token'ı isteyin'de belirttiğimiz istek gövdesi parametrelerine ek olarak, istek gövdesinde kapsamları da belirtebiliriz. Örneğin, write:payment iznini talep etmek istiyorsak, aşağıdaki isteği gönderebiliriz:

Birden fazla kapsam talep etmek için, bunları boşluklarla ayırabilirsiniz. Örneğin, scope=write:payment read:payment.

Kapsamları doğrula

Ödeme hizmetinde write:payment izni gerektiren bir işlem varsa, JWT yükünün kapsam talebini kontrol ederek kapsamları doğrulayabiliriz:

Sonuç

Sepet hizmetine erişimi de korumak istiyorsanız, aynı kimlik doğrulama akışını uygulayabilirsiniz. Bu sefer, sepet hizmeti API kaynağıdır ve istemci, erişmesi gereken başka bir hizmettir.

Logto ile API kaynaklarınız OAuth 2.0 ve JWT ile güvence altına alınır ve rol tabanlı erişim kontrolünü uygulayarak minimum ayrıcalık ilkesine uyabilirsiniz. Ayrıca, kullanıcılarınızı ve izinlerini yönetmek ve hatta üçüncü taraf kimlik sağlayıcıları ile entegre edebilirsiniz.