IdentityServer4 Yazı Serisi #7 – IdentityModel Paketi İle Programatik Yetki Talebinde Bulunma
Merhaba,
IdentityServer4 Yazı Serisinin bu yedinci makalesine kadar sunucudan yetki talebini Postman aracılığıyla gerçekleştirmiş bulunmaktayız. Bu içeriğimizde ise herhangi bir platformdaki(Console App, Web, Windows Forms vs.) uygulama aracılığıyla IdentityModel paketi eşliğinde Auth Server’dan nasıl yetki talebinde bulunabileceğimizi inceleyeceğiz.
IdentityModel Paketi Nedir?
C# ile bir API’a istekte bulunabilmek için System.Net.Http
namespace’i altında bulunan HttpClient sınıfı kullanılmaktadır. Bu sınıf ile API’lara yapılacak olan sıradan istekler çok kolay gerçekleştirilebilse de, gönderilecek olan request’in header’ına parametre eklenmesi gerektiği durumlarda manuel olarak konfigüre edilmesi gerekmektedir. Hele hele IdentityServer4 gibi header parametrelerinin yoğun bir şekilde kullanıldığı kompleks yapılanmalarda IdentityModel paketi, bünyesinde barındırdığı Extension metotlar eşliğinde HttpClient sınıfını zenginleştirmekte ve header işlemlerini daha dinamik bir şekilde gerçekleştirmemizi sağlamaktadır. Hatta IdentityModel paketi, IdentityServer4 ile o kadar uyumludur ki, Auth Server’da bulunan tüm endpoint’lere karşılık bir metot barındırmakta ve böylece bizleri sürekli bir endpoint takibinden kurtarmaktadır.
IdentityModel Eşliğinde IdentityServer4’deki Discovery Endpoint’i Tetikleme
IdentityModel sayesinde ilgili Auth Server’daki Discovery Endpoint’i ‘GetDiscoveryDocumentAsync’ metodu ile tetikleyerek aşağıdaki görselde olduğu gibi ilgili sunucuya dair tüm endpoint’leri elde edebiliriz.
Görüldüğü üzere tetikleme neticesinde sunucudaki tüm endpoint’ler tarafımızca elde edilmiştir. Haliyle kodlama sürecinde endpoint trafiğiyle uğraşmak mecburiyetinde kalmadan direkt olarak operasyona odaklanabileceğiz.
Programatik Yetki Talebinde Bulunma
Tüm bu bilgiler eşliğinde programatik yetki talebi için aşağıdaki gibi çalışılması yeterlidir.
HttpClient httpClient = new HttpClient(); DiscoveryDocumentResponse discovery = await httpClient.GetDiscoveryDocumentAsync("https://localhost:1000"); ClientCredentialsTokenRequest tokenRequest = new ClientCredentialsTokenRequest(); tokenRequest.ClientId = "GarantiBankasi"; tokenRequest.ClientSecret = "garanti"; tokenRequest.Address = discovery.TokenEndpoint; TokenResponse tokenResponse = await httpClient.RequestClientCredentialsTokenAsync(tokenRequest); httpClient.SetBearerToken(tokenResponse.AccessToken);
Yukarıdaki kod bloğunu izah etmemiz gerekirse eğer; 3. satırda ‘ClientCredentialsTokenRequest’ nesnesi ile yetki talep edecek olan client’ın kimlik bilgilerini taşıyacak olan nesne tanımlanmaktadır. 4 ve 5. satırlarda client kimlik bilgileri girilmekte, 6. satırda ise Auth Server’ın token endpoint’i adres olarak bildirilmektedir. Burada dikkat ederseniz token endpoint’i de manuel yazmakla uğraşmıyor ve direkt ‘DiscoveryDocumentResponse’ nesnesinden çekiyoruz. 7. satırda ise ‘RequestClientCredentialsTokenAsync’ metodu ile Auth Server’a istekte bulunuyor ve elde edilen yetkiyi/token değerini 8. satırda HttpClient nesnesine ‘SetBearerToken’ fonksiyonu aracılığıyla veriyoruz. Bu işlemlerden sonra HttpClient nesnesi Auth Server’dan elde edilen token değerini kullanarak hızlı bir şekilde hedef API’lara istek gönderebilecek yetenekte olacaktır.
Programatik Yetkiyi Kullanarak API’lara İstek Gönderme
Son olarak geriye HttpClient nesnesini kullanarak hedef API’lara aşağıdaki gibi istek göndermek kalmaktadır.
HttpResponseMessage response = await httpClient.GetAsync("https://localhost:2000/api/garantibank/bakiye/3000"); if (response.IsSuccessStatusCode) { int bakiye = JsonSerializer.Deserialize<int>(await response.Content.ReadAsStringAsync()); Console.WriteLine($"Hesap bakiyeniz : {bakiye}"); }
Kodları Derleyelim ve Test Edelim
Yaptığımız çalışmayı daha net değerlendirebilmeniz için bütünsel olarak aşağıda derleyelim ve ardından IdentityServer4 ve API’ler ayaktayken uygulamayı test maksatlı çalıştıralım.
class Program { static async Task Main(string[] args) { HttpClient httpClient = new HttpClient(); DiscoveryDocumentResponse discovery = await httpClient.GetDiscoveryDocumentAsync("https://localhost:1000"); ClientCredentialsTokenRequest tokenRequest = new ClientCredentialsTokenRequest(); tokenRequest.ClientId = "GarantiBankasi"; tokenRequest.ClientSecret = "garanti"; tokenRequest.Address = discovery.TokenEndpoint; TokenResponse tokenResponse = await httpClient.RequestClientCredentialsTokenAsync(tokenRequest); httpClient.SetBearerToken(tokenResponse.AccessToken); HttpResponseMessage response = await httpClient.GetAsync("https://localhost:2000/api/garantibank/bakiye/3000"); if (response.IsSuccessStatusCode) { int bakiye = JsonSerializer.Deserialize<int>(await response.Content.ReadAsStringAsync()); Console.WriteLine($"Hesap bakiyeniz : {bakiye}"); } } }
İlgilenenlerin faydalanması dileğiyle…
Sonraki yazılarımda görüşmek üzere…
İyi çalışmalar…
1 Cevap
[…] IdentityServer4 Yazı Serisi #7 – IdentityModel Paketi İle Programatik Yetki Talebinde Bulunma […]