Yazılım Mimarileri ve Tasarım Desenleri Üzerine

IdentityServer4 Yazı Serisi #3 – Client Credentials

Merhaba,

Temsili Client Credentials diyagramı…

IdentityServer4 Yazı Serisinin bu üçüncü makalesinde Client Credential yetki tipi ile gerekli konfigürasyonlar eşliğinde IdentityServer4 uygulaması geliştirecek ve ayağa kaldıracağız. Client Credential; machine to machine kimliklendirme dediğimiz iki uygulama arasındaki etkileşime istinaden kullanılan bir akış türüdür. Kullanıcı(User) kimlik doğrulamasından ziyade sadece client’ın doğrulanması önemliyse(authorization) tercih edilmektedir.

Client Credentials, resource server’ları korumak için IdentityServer4’ı kullanmanın en temel senaryosunu sunar.

Client Credentials Stratejisi

Client Credentials yetki tipinde Auth Server sadece client’lara, sistemde tanımlı olan API’lara(resources) erişim yetkisi vermektedir. Yandaki görüntüde de görüldüğü üzere sistemdeki tüm client’lar(her ne kadar tekil örneklendirilmiş olsada) Auth Server tarafından tanımlanmaktadır. Bu tanımlamada tüm client’lara, birbirlerinden ayırmak ve o anki isteğin hangi client’tan geldiğini anlayabilmek için Auth Server tarafından Client ID ve Client Secret değerleri atanmaktadır. Bu değerleri kullanarak Auth Server’dan token elde eden client, ilgili token’ı kullanarak API’lara istekte bulunacaktır. API’lar ise gelen token’ı kontrol edecek ve sistemdeki Auth Server tarafından dağıtılmış olduğunu anladığı taktirde onaylayarak veri erişimine izin verecektir…

Client Credentials, kullanıcıdan ziyade client’ın doğrulanmasını baz alır.

Client Credentials, client doğrulanması temelli olduğundan dolayı kullanıcı ile ilgili işlemlerin(üyelik sistemi, kullanıcı doğrulama vs.) olmadığı durumlarda tercih edilmektedir. Client’ın doğrulanması, client ile API’lar arasındaki etkileşimin/iletişimin/konuşturmanın bir gereği olacağı için makalemizin ilk paragraflarında değinildiği gibi machine to machine tarifiyle nitelendirilmektedir. Dolayısıyla iki uygulamanın(client – API) kendi aralarında iletişim için yetkilendirmesi durumunu Client Credentials ile gerçekleştirmekteyiz. Peki hocam, user ile ilgili yetkilendirme durumunu nasıl gerçekleştirmekteyiz? şeklinde sorunuzu duyar gibiyim… User ve daha nice durumlarla ilgili işlemlerde kullanacağımız izin tiplerini yazı serimizin devamındaki makalelerde tek tek ele alacağımızı bildiririm. O yüzden acele etmeksizin konumuzda kalmaya özen gösterelim 🙂

Client Credentials’da kullanıcı üyelik sistemi vs. gibi kullanıcıya dair operasyonlar bulunmamaktadır. Sistemdeki yapıların(client – API) birbirleriyle haberleşmesine dayalı bir yetkilendirme yöntemidir.

IdentityServer4 – Client Credentials İle Machine to Machine Kimliklendirme Örneği

Evet, içeriğimizin bu noktasından itibaren artık bir IdentityServer4 uygulaması ayağa kaldıracak ve Client Credentials yetki tipiyle machine to machine yetkilendirmenin nasıl yapıldığını tüm detaylarıyla pratikte inceleyeceğiz.

Tabi her pratiğin küçükte olsa bir teorisi vardır. Şu ana kadar attığımız teorik temellerin dışında IdentityServer4 yapılanmasının da temel kavramları olan “API Resource” ve “API Scope” terimlerini tanımlamadan uygulamaya girişmek, pratikte performansımızı olumsuz etkileyecektir.

Bu açıklamalardan sonra artık uygulamamıza başlayabiliriz. Uygulamamız bir banka senaryosu üzerinden işlevsellik gösterecektir. IdentityServer4 uygulaması için ‘AuthServer’ isimli bir API projesi, Resource Servers için ise ‘GarantiAPI’ ve ‘HalkBankAPI’ isimli iki adet API projesi oluşturacağız. Süreçte client olarak Postman’i kullanacağız.

dotnet new webapi --name AuthServer Port : 1000
dotnet new webapi --name GarantiAPI Port : 2000
dotnet new webapi --name HalkBankAPI Port : 3000

Hadi kodlayalım…

Test Edelim

Şimdi geliştirilen tüm uygulamaları ayağa kaldırarak test edelim.

Uygulamaların ayağa kaldırılması
Postman ile API’a istek gönderme
Görüldüğü üzere client direkt olarak API’a istek gönderdiğinde 401(Unauthorized) hata kodu almaktadır. Şimdi yapması gereken Auth Server’a gidip bir token talebinde bulunmaktır.
Auth Server’dan token talebinde bulunma
Token talebi yapılırken body’den ‘client_id’, ‘client_secret’ ve ‘grant_type’ değerlerinin verildiğine dikkatinizi çekerim. Bu değerler makale seyrimiz boyunca değindiğimiz Auth Server’da ki client karşılıklarıdır.
Token ile API’a talepte bulunma
Token ile API’a talepte bulunabilmek için ‘Authorization’ sekmesinden ‘OAuth 2.0’ type’ını seçerek, ‘Header Prefix’ ‘Bearer’ karşılığında, ‘Access Token’ alanına elde edilen token değeri verilmeli ve o şekilde istek gönderilmelidir. Görüldüğü üzere istek başarılı bir şekilde sonuçlanacaktır.

Lakin elde edilen token ile ‘HalkBankAPI’a istek yapmak istersek eğer;

401 durum koduyla karşılaşılacaktır. Bunun nedeni ilgili token’ın sadece ‘GarantiAPI’a erişim sağlayabilmesidir. ‘HalkBankAPI’a talep yapılabilmesi için client’ın Auth Server’dan ilgili API’a ait bir token değeri istemesi ve elde edeceği token ile talepte bulunması gerekmektedir;

Görüldüğü üzere IdentityServer4 uygulamamızın testi başarıyla sonuçlanmıştır. Şimdi son olarak üretilen JWT yapılanmasının nasıl bir içeriğe sahip olduğunu inceleyerek makalemizi noktalayalım.

JWT İncelemesi

Üretilen JWT değerini açabilmek ve üzerinde tutulan değerleri(Payload) inceleyebilmek için decode etmemiz gerekmektedir. Bunun için jwt.io adresini kullanabilirsiniz. İlgili adreste açılan forma elinizdeki JWT değerini verirseniz eğer decode edip, taşıdığı tüm payload’ları sizlere gösterecektir.

Örnek amaçlı HalkBankAPI için üretilen JWT değeri kullanılmıştır…

Burada JWT içerisindeki şifrelenmiş tüm Payload’ları görebilmek sizler açısından hafif bir kuşkuya mahal vermiş olabilir ve hani burada güvenlik! sorusunu sormanızı sağlayabilir. Evet, JWT’ler bu şekilde decode edilebilmektedir ama server’da ki hashlenmiş secret key’i bilmeden kimse herhangi bir valid değer üretememektedir. Bu da token’ın public olmasına herhangi bir sakınca getirmemektedir.

Velhasıl, yukarıda decode edilmiş olan JWT payload’larına göz atarsak eğer;

görüldüğü üzere tüm bilgiler karşımızdadır. Burada aud(Audience) değeri bu JWT’nin hangi resource tarafından kabul edileceğini, client_id değeri istek yapan client’ın Auth Server’da ki kimlik bilgisini ve scope değeri ise ilgili client’ın taşıdığı tüm yetkilerini bildirmektedir.

Sonuç
Bu makalemizde IdentityServer4 temellerini pratikte tüm detaylarıyla ele almış, bir Auth Server’dan nasıl token talebinde bulunulabileceğini, client’ın elde ettiği token ile ne şekilde API’lara erişim sağlayabileceğini vs. üzerinde uzun uzun istişare ederek örneklendirmiş bulunmaktayız. Bundan sonra herhangi bir client uygulaması üzerinden bu operasyonun nasıl gerçekleştirilebileceğini çok rahat anlayabilecek seviyede temellerin atıldığını düşünmekteyim. Sonraki içeriklerimizde adım adım yetkilendirme boyutunu detaylandıracak ve olayı daha kurumsal uygulamalarda profesyonel çalışmalar yapabilecek noktalara getireceğiz…

İlgilenenlerin faydalanması dileğiyle…
Sonraki yazılarımda görüşmek üzere…
İyi çalışmalar…

Not : Örnek çalışmayı indirebilmek için buraya tıklayınız.

Exit mobile version