IdentityServer4 Yazı Serisi #13 – Merkezi Üyelik Sistemi – Access Token İle API’lerle Haberleşme
Merhaba,
Bir önceki Merkezi Üyelik Sistemi – Claim ve Authentication Propertyleri Okuma başlıklı makalemizde IdentityServer4 mimarisinden claim bilgileri ile birlikte access token, refresh token gibi değerlerin nasıl alındığını incelemiştik. Bu içeriğimizde ise client tarafından elde edilen access token ile IdentityServer4 tarafından korunan API’lara nasıl erişilebildiğini inceleyeceğiz.
Client’a Scope(Erişim Yetkisi) Verme?
Client, her ne kadar access token bilgisini elinde barındırıyor olsada erişmek istediği API’ın ‘Scope’larını da barındırması gerekmektedir. Misal; ‘GarantiAPI’ isimli API’a erişmek istediğimizi varsayalım.
Görüldüğü üzere ilgili API’ı IdentityServer’da temsil eden ‘ApiResource’ nesnesindeki ‘Scopes’ koleksiyonunda API’ın erişim yetkileri tanımlanmıştır. Dolayısıyla bu yetkilerin ‘Config.cs’de geliştirilen client’ta(OnlineBankamatik) da tanımlanması gerekmektedir.
Şöyle ki;
Bu işlemden sonra client tarafından istenilen scope’lar(yetkiler) birde ilgili client uygulamasının ‘Startup.cs’ dosyasında da bildirilmelidir.
Client uygulamasında bu işlemi yapmamızın sebebi, IdentityServer’da(Auth Server) kendisine dair oluşturulmuş client’ta bu scope değerleri tanımlanmış olup olmamasını check etmesidir. Aksi taktirde, IdentityServer tarafında tanımlı olan client’a verilmeyen bir scope değeri, client tarafından talep edilirse hata meydana gelecektir.
Yapılan bu konfigürasyonlardan sonra artık uygulamayı test edebiliriz.
Test Edelim
Test için öncelikle client tarafından giriş yapılmalı ve ardından bu ayarlarda(yani belirtilen scope değerlerinde) yetkileri barındıran access token elde edilmelidir.
Evet, access token’ı elde ettiğimize göre artık testimize başlayabiliriz.
Postman İle Test
Access token ile Postman üzerinden yapılan istek neticesinde görüldüğü üzere başarıyla authorized olunmakta ve haberleşme sağlanmaktadır.
Client Uygulaması İle Test
Client uygulaması üzerinden access token’ı kullanarak API ile haberleşmek istiyorsanız eğer aşağıdaki gibi bir çalışma sergileyebilirsiniz;
[Authorize] public async Task<IActionResult> OdemeYap() { var authenticationProperties = (await HttpContext.AuthenticateAsync()).Properties.Items; string accessToken = authenticationProperties.FirstOrDefault(x => x.Key == ".Token.access_token").Value; HttpClient httpClient = new HttpClient(); httpClient.DefaultRequestHeaders.Add("Authorization", $"Bearer {accessToken}"); HttpResponseMessage responseMessage = await httpClient.GetAsync("https://localhost:2000/api/garantibank/bakiye/3"); string bakiye = await responseMessage.Content.ReadAsStringAsync(); ViewBag.Bakiye = bakiye; return View(); }
Görüldüğü üzere her iki testimizde başarıyla sonuçlanmıştır.
İlgilenenlerin faydalanması dileğiyle…
Sonraki yazılarımda görüşmek üzere…
İyi çalışmalar…
Not : Örnek çalışma dosyasını indirmek için buraya tıklayınız.
hocam burada eksik birşey var sanki? apiye gidebilmek için client_id , secret id ve client token da göndermemiz gerekmiyor mu?
Access token alındıktan sonra artık yetkilisin demektir. Client Id, Secret vs. gibi değerleri API denetlemez ki! Auth Server denetler. Dolayısıyla API’ye gidebilmek için bir tek token yeterli olacaktır.