Spring OAuth 2.0 Birden çok Resource Server

Ferhat Aykan
4 min readJun 29, 2020

--

Bir önceki yazımızda Spring OAuth 2.0 Custom Token konusunu işledik. Bu yazımızda bir den çok Resource Server oluşturup aralarındaki iletişimi inceleyeceğiz.

Projemizde yeni bir ‘campaign-api’ module oluşturacağız. ‘campaign-api’yi ‘auth-service’imize yeni client olarak ekleyelim.

Her yeni client için yeni bir client details eklememize gerek yok ama örnekleri çeşitlendirebilmek için ayrı ayrı ekliyorum. Client bilgisini ekledikten sonra ‘campaign-api’mize gelerek application.yml bilgilerini tanımlayalım.

Uygulamazın çalışacağı port, name ve security bilgilerini ‘product-api’deki gibi tanımladık.

‘product-api’deki configuration ve model kısımlarını kopyalayarak ‘campaign-api’ içine ekliyoruz.

Her yeni gelen Resource Server için bunu yapmak yerine ortak bir module oluşturup o module yeni gelen Resource Server’lara ekleyebiliriz. Proje uzamaması için ekleme işlemini yapmıyorum.

Örnek olarak kullanıcı ‘campaign-api’de tanımlı campaign’i ve içindeki product’ları çekmek istiyor. Biz ‘campaign-api’ üzerinden ‘product-api’ye request atarak products’ları alıp CampaignResponse nesnesini kulanıcıya döneceğiz.

‘campaign-api’, ‘product-api’den products’ları alabilmesi için yeni endpoint tanımlıyoruz ve bu endpoint’e erişebilmesi için ‘ROLE_CLIENT’ yetkisinin olmasını bekliyoruz.

‘auth-service’de AuthorizationServerConfiguration class’ımıza girerek ‘campaign-api’ client’ımıza ‘ROLE_CLIENT’ yetkisi verdik. Bu sayede ‘campaign-api’miz ‘product-api’den ‘ROLE_CLIENT’ yetkisiyle products’ları alabilecek.

‘product-api’ den product’ları alırken feign kullanacağız. Feign için

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-httpclient</artifactId>
</dependency>

dependencies’lerini diğer api ve service’lerden de kullanabilmek için projemizin parent pom’una ekliyorum.

Daha sonra ‘campaign-api’ application.yml dosyasına gelerek feign konfigürasyonunu yapıyoruz.

‘campaign-api’ ‘product-api’ye request atarken kendisine ait bir token olması gerekiyor. Bu token’u alabilmek için OAuth2RestTemplate’den faydalanacağız. ResourceServerConfiguration class’ımıza gelerek OAuth2RestTemplate bean tanımlayalım.

Feign konfigürasyonu yapmaya devam edelim. Request’lerimiz için interceptor tanımlaması yapalım.

Feign Client’larımızdan Authorization gerektiren bir client’a request atacaksak FeignClientAuthorizationRequestInterceptor’unu kullanacağız eğer Authorization gerektirmeyen bir client’a request atacaksak FeignClientRequestInterceptor’unu kullanacağız. Nasıl kullanacağımızı FeignClientConfiguration’da tanımlıyoruz.

İki tane konfigürasyon class’ı tanımladık. Bunlardan hangisini kullanacağımızı Feign Client’da belirtiyoruz.

CampaignService class’ımızdan fake bir CampignResponse hazırlayalım.

CampaignService içinden ProductApiClient aracılığıyla products’ları çekeceğiz ve CampaignResponse içine koyup controller aracılığıyla response döneceğiz.

Postman’den ‘campaign-api’ ye request atmadan feign interceptor’una debug koyup daha sonra request atarak ‘campaig-api’ nin ‘auth-service’ den aldığı token’a bakalım.

Interceptor’umuzda access token’u evaluate edip kopyalıyorum ve JWTDebugger’da ‘campaign-api’nin aldığı token’a bakalım.

Token içinde yetkileriyle beraber client_id değerini görmekteyiz.

Postman’den ‘campaign-api’den gelen response görüyoruz.

Bu yazımızda Resource Server’lar kendi aralarında nasıl iletişim kurabilir, client’ların sınırlandırılması ve izin verilen resource’lere erişimin nasıl yapıldığından bahsettik.

Bir sonraki yazımızda Refresh Token nasıl alınır ve expire olan token nasıl yenilenir olduğundan bahsedeceğiz.

İyi çalışmalar.

--

--