Mikro Hizmet Mimarimizde Kimlik Doğrulaması ve Yetkilendirmeyi Nasıl Çözdük

Andela’da, dahili süreci yönetmek ve bizi daha verimli hale getirmek için kullanılan dahili Mühendislik ekipleri tarafından oluşturulmuş birden çok dahili uygulamaya sahibiz. Zaman geçtikçe, uygulamaların sayısı arttı ve büyümemizi idare etmemizi sağlamak için her uygulamanın zamanla birlikte gelişmesi gerekiyordu. Bizi kurtuluş için mikro hizmetlere yönelmeye zorlayan bir dizi sorunlu noktayı (burada belgelenmiştir) yaşamaya başladık.

Şimdiye kadarki mikro hizmet yolculuğumuz hakkında daha fazla bilgi edinmek istiyorsanız, EventSourcing ve CQRS ile Ölçeklenebilir Mimari, Antifragile Microservice ve From Monolith to Microservices blog yayınlarına göz atmanızı öneririm.

Kimlik doğrulama / yetkilendirme katmanımızın Yapı Taşları

Mimarimiz, sağlam bir kimlik doğrulama / yetkilendirme katmanı elde etmek için birlikte çalışan bir dizi yapı taşına sahiptir.

FrontEnd Uygulamaları

Her uygulama (beceri ağacı, kaizen, pulse, ayırmalar) bağımsızdır ve farklı ön uç çerçevesinde yazılır. Her uygulamanın giriş sayfası benzer ve basittir. Tahsisler uygulaması için giriş sayfası aşağıdadır.

Giriş yapmak için, kullanıcı sadece `http://api-prod.andela.com/login?redirect_url=http://allocations’a bağlantı olan Google ile Giriş düğmesini tıklar. andela.com`. Kullanıcı düğmeyi tıkladığında, api ağ geçidinin giriş uç noktası onu alır, gerekli tüm sihri gerçekleştirir, kullanıcının oturum açmasını sağlar ve kullanıcıyı arayan uygulamaya yönlendirir.

Belirteç Tabanlı Kimlik Doğrulama

Bir monolitte, durum bilgisi olan bir uygulama olarak inşa edilmesi normaldir. Bu nedenle, oturum tabanlı kimlik doğrulama gerçekten iyi çalışıyor. Ancak, talepleri birden çok bağımsız hizmete yönlendirmeniz gerektiğinden mikro hizmetlerde durum böyle değildir. Sistemimizde vatansızlığı sürdürmek için jeton kimlik doğrulamasını kullanmayı seçtik. Kullanıcı iddialarını jwt’de paketledik. JSON Web Token (jwt), iki taraf arasındaki iddiaları güvenli bir şekilde temsil etmek için açık, endüstri standardı bir RFC 7519 yöntemidir.

Bir kullanıcı başarıyla oturum açtığında, bir jwt döndürülür. Sonraki isteklerde, kullanıcı bu jetonu her bir isteğe eklemelidir. Bu, api ağ geçidinin kullanıcının kimliğini belirleyebilmesi ve kullanıcının hak taleplerini belirteçten çıkarabilmesi için gereklidir.

Tek Oturum Açma (SSO)

SSO, bağımsız uygulamalar paketine yalnızca bir kez giriş yapmak anlamına gelir. Bizim durumumuzda, bir uygulamaya (örn. Skilltree) giriş yaptığınızda, otomatik olarak oturum açacağınız için başka bir uygulamaya (örn. Pulse) erişmeye çalıştığınızda tekrar giriş yapmanız gerekmeyecek. SSO ile kullanıcılarımız olmayacak dahili uygulamalarımızdan birini her kullanmak istediklerinde oturum açma zahmetinden kurtulun.

Sistemimizde SSO’nun uygulanma şekli basittir. Bir kullanıcı herhangi bir ön uç uygulamasından ilk kez oturum açtığında, api-gateway’de jwt-token adlı bir çerez oluşturulur. Çerezin etki alanı .andela.com şeklindedir ve bu nedenle tüm andela.com alt etki alanı tarafından erişilebilir. Ön uç uygulamalarının herhangi birinden api ağ geçidine istek yapıldığında, ayarlanmışsa jwt-token adlı çerezi çıkarırız. Ayarlanmazsa, kullanıcının oturum açmadığını varsayar ve api-gateway’den bir 401 durum kodu döndürürüz.

NOT: Tüm dahili uygulamalarımız andela.com alt etki alanında barındırılır, örneğin, skilltree.andela.com, pulse.andela.com, assignations.andela.com vb.

Mobil Uygulamalar

Bir mobil uygulama açıkça andela.com alt alanında olmadığından, api-gateway jwt’yi Yetkilendirme başlığı aracılığıyla Taşıyıcı Jetonları olarak geçirmeyi destekler. Mobil uygulamalar için kimlik doğrulama akışı, web uygulamalarından biraz farklıdır. Google oauth’u kullandığımız için, oauth akışı mobil uygulamada gerçekleşiyor. Kullanıcının kimliği Google üzerinden başarıyla doğrulandıktan sonra, api ağ geçidinden bir jwt ile takas etmek için Google erişim belirteçlerini kullanırız.

Üçüncü Taraf Uygulamaları

Sistemimiz ayrıca api-token kimlik doğrulamasını da destekler. Bu gereklidir, çünkü kimlik doğrulama sürecine her kullanıcı dahil olmaz. Bazı verilere erişmek için yalnızca üçüncü taraf bir uygulamaya ihtiyacınız olabilir. Her kullanıcının, uygulamaya üçüncü taraf bir uygulamadan erişmek için kullanabileceği bir api-belirteci vardır. Ayrıca, sistemimize yalnızca api-token’lar aracılığıyla erişebilen bir hizmet hesabı oluşturabiliriz.

Kimlik Doğrulama

API ağ geçidi, ön uç uygulamaları ile mikro hizmetler paketi arasındaki aracıdır. Jwt’yi ve dolayısıyla kimlik doğrulamasını oluşturmaktan sorumludur. Bunu yetkilendirme ve kullanıcı servisi ile iletişim kurarak gerçekleştirir. API ağ geçidi golang ile yazılmıştır ve kimlik doğrulama mantığı bir paket olarak çıkarılmış ve bir ara yazılım olarak monte edilmiştir. Kimlik doğrulama kodunun bir parçasını burada bulabilirsiniz.

handleOauth2Callback , google geri arama url’si tarafından çağrılan yöntemdir. Yöntem, bir google erişim belirteci için döndürülen kodu değiştirir. Bu belirteci kullanarak kullanıcının profil bilgilerini alır. Bu profil bilgisi bir kullanıcı yapısı olarak paketlenir ve jwt’yi oluşturmak için kullanılır. Jwt’nin oluşturulması, yetkilendirme hizmetinin kullanıcıları hizmeti FindOrCreate uç noktasına ve FetchPermissions uç noktasına bir çağrı yapılmasını içerir. Her iki uç noktadan alınan bilgi jwt’deki talepler olacaktır. Bilgiler alındıktan sonra, jwt-token adlı bir çerez, çağıran uygulamanın andela.com alt etki alanında olması koşuluyla jwt ile ayarlanacaktır. Aksi takdirde, belirteç kullanıcıya sorgu dizesi olarak geri döndürülür.

Hak Talepleri

Bir dizi kullanıcı bilgisi jwt’de iddia edildiği gibi paketlenmiştir. Aşağıda örnek bir jwt’deki iddialar verilmiştir.

Yetkilendirme

Monolitlerden mikro hizmetlere geçerken, bir yetkilendirme hizmeti oluşturarak yetkilendirme çabamızı merkezileştirmemiz gerekiyordu. Sistemlerimizde yetkilendirme tamamen izne dayalıdır. İzinler, bir api uç noktasına erişimi kısıtlamak ve ayrıca kullanıcıların ön uç uygulamalarındaki görünümünü kontrol etmek için kullanılır.

Yetkilendirme hizmetindeki izinler , kullanıcı hizmetindeki rollerle pek çok ile pek çok ilişkiye sahiptir. Bir iznin etkinliklerle (uç nokta) çoktan çoğa ilişkisi vardır. Bir kullanıcının birçok rolü ve dolayısıyla birçok izni vardır. Bir kullanıcı api ağ geçidine bir istekte bulunduğunda, istek jwt’yi (tanımlama bilgisinden veya başlıktan) çıkaran, geçerli olduğunu doğrulayan ve jwt’den izin talebini alan yetkilendirme ara yazılımından geçer. Daha sonra, yetkilendirme hizmetinin Yetkilendir uç noktası, çağrılan uç noktanın url ve http fiilinin yanı sıra izinlerle çağrılır. Yetkilendirme uç noktası, kullanıcının izninden herhangi birinin uç noktaya erişimi varsa, esasen doğru değerini döndürür.

Aşağıda, yetkilendirme hizmetinin kullanıcı hizmetiyle ilişkisini gösteren ER diyagramı bulunmaktadır.

Bir kullanıcının yetkili olup olmadığını kontrol eden sorgu buna benzer.

Bu sorgu, 0’dan büyük bir değer döndürürse, kullanıcı yetkilendirilir. Sorgudan: yöntem POST , GET , PUT , DELETE , PATCH . : url, kullanıcının erişmeye çalıştığı uç noktanın url'sidir, ör. / api / v1 / roller veya / api / v1 / roles / some-id / users . Etkinlikler tablosunda, bir joker karakterle eşleşmeyi sağlayan bir normal ifade alanı vardır. ör. url_regex alanı / api / v1 / roles / [^ /? #] + / users değerine sahip olabilir ve bu nedenle / api / v1 / roles ile eşleşir / bir-kimlik / kullanıcılar . : allowIds, kullanıcının erişebildiği izinler dizisidir. Bu izin listesi, kullanıcı taleplerinden alınmıştır.

Yetkili Alanlar

Yukarıdaki yetkilendirme kurulumu çoğu senaryoda çalışır. Ancak, farklı kullanıcıların aynı uç noktaya erişiminin olduğu ancak gördükleri içeriğin farklı olduğu bazı durumlar vardır, yani bazı kullanıcılar döndürülen sonuçta ekstra özellikler görebilir. Bu tür bir senaryoda, yetkilendirme yine de yetkilendirme hizmeti aracılığıyla her zamanki gibi gerçekleşir, ancak çağrılan mikro hizmet, kullanıcı izinlerini meta veri olarak almaya devam edecek ve kullanıcının iznine bağlı olarak belirli alanları döndürecektir.

Sonuç

Bir mikro hizmet mimarisinde sağlam bir kimlik doğrulama / yetkilendirme sistemi oluşturmak önemsiz değildir. Aynı mikro hizmetleri kullanan farklı uygulamalarınız olduğunda bu daha da karmaşıktır. Ayrıca, her yeni uç nokta eklendiğinde veya yeni uygulamalar oluşturulduğunda kodda değişiklik yapmaya başlamak istemezsiniz.

Lütfen yorum bölümünde bir mikro hizmet mimarisinde yetkilendirme oluşturma deneyimlerinizi paylaşın. Sizden haber almak isterim.

Bunu beğendiyseniz, aşağıdaki💚 düğmesini tıklayın, böylece diğer insanlar bunu Medium'da görsün. Ayrıca, herhangi bir sorunuz veya gözleminiz varsa, düşüncelerinizi / sorularınızı paylaşmak için yorum bölümünü kullanın.