Bu makalede, Firebase ve Node.js kullanarak kullanıcıları ve rolleri yönetmek için bir REST API oluşturacağız. Ek olarak, hangi kullanıcıların belirli kaynaklara erişebileceğini yetkilendirmek için bu API’yi nasıl kullanacağımızı göstermeye çalışacağım.

Başlangıç

Hemen hemen her uygulama, belirli bir düzeyde yetkilendirme sistemi gerektirir. Bazı durumlarda, önceden ayarlanmış bir kullanıcı adı ve parolayı doğrulamak yeterlidir, ancak çoğu zaman, belirli kullanıcıların belirli kaynaklara erişmesine ve bunları diğerlerinden kısıtlamasına izin vermek için daha ayrıntılı bir izin modeline ihtiyacımız vardır. İkincisini desteklemek için bir sistem oluşturmak oldukça önemlidir ve gerçekten fazla zaman alabilir. Bu makalede, hızlı bir şekilde çalışmaya başlamamıza yardımcı olacak Firebase Auth. kullanacak rol tabanlı bir kimlik doğrulama API‘sinin nasıl oluşturulacağını öğreneceğiz.

Rol tabanlı Kimlik Doğrulama

Bu yetkilendirme modelinde, belirli kullanıcılar yerine rollere erişim verilir ve izin modelinizi nasıl tasarladığınıza bağlı olarak bir kullanıcı bir veya daha fazlasına sahip olabilir. Öte yandan kaynaklar, bir kullanıcının uygulamasına izin vermek için belirli roller gerektirir.

Rol tabanlı kimlik doğrulamayı daha iyi anlayabilmek için bu şekli inceleyebilirsiniz.

Rol tabanlı kimlik doğrulamayı daha iyi anlayabilmek için bu şekli inceleyebilirsiniz.

Firebase

Firebase Authentication (Firebase Kimlik Doğrulama)

Firebase Authentication, genişletilebilir token tabanlı bir kimlik doğrulama sistemidir ve diğerlerinin yanı sıra Google, Facebook ve Twitter gibi en yaygın sağlayıcılarla kullanıma hazır entegrasyonlar sağlar. Ayrıca esnek bir rol tabanlı API oluşturmak için yararlanacağımız özel talepleri kullanmamızı sağlar. Bu taleplere herhangi bir JSON değeri koyabiliriz. Örnek vermek gerekirse;

{ role: 'admin' }

{ role: 'manager' }

Gerekli ayarlar yapıldıktan sonra, özel hak talepleri Firebase’in oluşturduğu token’e dahil edilir ve erişimi kontrol etmek için değeri okuyabiliriz. Ayrıca, çoğu durumda fazlasıyla yeterli olacak çok cömert bir ücretsiz kota ile birlikte gelir.

Firebase İşlevleri

Firebase İşlevleri, tamamen yönetilen sunucusuz bir platform hizmetidir. Kodumuzu Node.js’ee yazmamız ve dağıtmamız gerekiyor. Firebase, altyapının isteğe bağlı olarak ölçeklendirilmesi, sunucu yapılandırması ve daha fazlasıyla ilgilenir. Bizim ise, API’mizi oluşturmak ve HTTP aracılığıyla web’e sunmak için kullanacağız.

Firebase, express.js uygulamalarını farklı yollar için, işleyici olarak ayarlamamıza olanak tanır. Örneğin, bir Express uygulaması oluşturabilir ve onu /mypath‘e bağlayabilirsiniz. Böylece bu rotaya gelen tüm istekler app tarafından işlenir.

Yönetici SDK‘sını (Admin SDK) kullanarak bir işlev bağlamından tüm Firebase Authentication API‘ye erişebilirsiniz.

Ne İnşa Edeceğiz?

Başlamadan önce, ne inşa edeceğimize bir göz atalım. Adım adım gitmek, konunun çok daha iyi anlaşılmasını sağlayacaktır. Aşağıdaki uç noktalara sahip bir REST API oluşturacağız:

HTTPPathAçıklamaDoğrulama
GET/usersTüm kullanıcıları listelerYalnızca yöneticiler erişebilir
POST/usersYeni kullanıcı yaratırYalnızca yöneticiler erişebilir
GET/users/:id:id kullanıcısını alırYöneticiler ve aynı :id kullanıcıları erişebilir
PATCH/users/:id:id kullanıcısını güncellerYöneticiler ve aynı :id kullanıcıları erişebilir
DELETE/users/:id:id kullanıcısını silerYöneticiler ve aynı :id kullanıcıları erişebilir

Bu uç noktaların her biri kimlik doğrulamasını ele alacak, yetkilendirmeyi doğrulayacak, karşılık gelen işlemi gerçekleştirecek ve son olarak anlamlı bir HTTP kodu döndürecektir. Token’i doğrulamak için gerekli kimlik doğrulama ve yetkilendirme işlevlerini oluşturacağız ve taleplerin işlemi yürütmek için gerekli rolü içerip içermediğini kontrol edeceğiz.

API’yi Oluşturmaya Başlayalım

API’yi oluşturmak için şunlara ihtiyacımız var:

  • Bir Firebase projesi ve
  • firebase-tools ‘un sisteminizde yüklenmiş olması gerekiyor.

Şimdi ise Firebase’e giriş yapın:

firebase login

Ardından, bir functions projesi başlatın. Bunun için aşağıdaki kodları takip edebilirsiniz:

Buradan sonra, bir Functions klasörünüz olması gerekir.

src/index.ts adresinde, İşlevlerinizin çalıştığını doğrulamak için açıklamayı kaldırabileceğiniz bir helloWorld örneği olacaktır. Ayrıca bu aşamadan sonra cd functions ve npm run serve komutlarını çalıştırabilirsiniz. Bu komut, kodu aktaracak ve yerel sunucuyu başlatacaktır.

Sonucunuza http://localhost:5000/{ornek-projemiz}/us-central1/helloWorld adresinden göz atabilirsiniz.

'index.ts: 'helloWorld' : işlevin adının olarak tanımlanan yolda gösterildiğine dikkat edin.

Firebase HTTP İşlevi Oluşturma

Şimdi API’mızı kodlayalım. Bir HTTP Firebase işlevi oluşturacağız ve onu /apiyoluna bağlayacağız.

İlk önce npm install express‘i kurun.

src/index.ts içerisinde bazı işlemler yapacağız.

  • Firebase-Admin SDK modülünü şununla başlatın: admin.initializeApp();
  • Bir Express uygulamasını apihttps uç noktamızın işleyicisi olarak ayarlayın.

Bu işlemleri aşağıdaki gibi yapabilirsiniz:

Şimdi, /api‘ye giden tüm istekler app tarafından ele alınacak.

Yapacağımız bir sonraki şey, app örneğini CORS’u destekleyecek şekilde yapılandırmak ve JSON gövde ayrıştırıcı ara yazılımını eklemek. Bu şekilde herhangi bir URL’den istekte bulunabilir ve JSON formatlı istekleri ayrıştırabiliriz.

İlk önce gerekli bağımlılıkları kuralım.

Sonra ise;

Son olarak, app‘in işleyeceği rotaları yapılandıracağız.

Firebase Functions, bir Express uygulamasını işleyici olarak ayarlamamıza olanak tanır ve sizin kurduğunuz uygulamadan sonraki herhangi bir yol (ki biz burada functions.https.onRequest(app); kullandık), app tarafından da ele alınacaktır.

Bu, api/users gibi belirli uç noktalar yazmamıza ve daha sonra yapacağımız her HTTP fiili için bir işleyici ayarlamamıza olanak tanıyacaktır.

Şimdi ise, src/users/routes-config.ts dosyasını oluşturalım.

Burada POST '/users'için bir create işleyici belirleyeceğiz.

Şimdi de src/users/controller.ts dosyasını oluşturacağız.

Bu işlevde, önce tüm alanların gövde isteğinde olduğunu doğrularız ve kullanıcıyı oluşturup özel istekleri belirleriz.

Burada{ role }işlevini geçiyoruz. Çünkü bu zaten setCustomUserClaimsiçerisinde Firebase tarafından belirlenmiş olacak.

Eğer her hangi bir hata oluşmazsa, oluşturulan kullanıcının uid kimliğiyle bir 201 kodu döndürürüz.

Şimdi, yetkilendirme ekleyerek işleyiciyi güvenli hale getirelim. Bunu yapmak için, create uç noktamıza birkaç işleyici ekleyeceğiz. express.js ile, sırayla yürütülecek bir işleyici zinciri ayarlayabilirsiniz. Bir işleyicide kodu çalıştırabilir ve next() işleyiciye iletebilir veya bir yanıt döndürebilirsiniz. Yapacağımız şey, önce kullanıcının kimliğini doğrulamak ve ardından yürütme yetkisine sahip olup olmadığını doğrulamaktır.

 src/users/routes-config.tsdosyamızda aşağıdaki güncellemeleri yapmaya başlayabiliriz.

Şimdi ise src/auth/authenticated.ts dosyasını oluşturalım.

Bu işlevde, authorization belirtecinin varlığını doğrulayacağız. Sonra bunu admin.auth().verifyidToken() ile deşifre edeceğiz  ve kullanıcının uidrole ve email bilgilerini res.localsüzerinde saklayacağız. Elbette daha sonra bu bilgileri yetkilendirmeyi doğrulamak için kullanacağız.

Token’in geçersiz olması durumunda, kullanıcıya bir 401 yanıtı döndüreceğiz:

Şimdi ise bir src/auth/authorized.ts dosyası oluşturalım.

Bu işleyicide, res.locals, daha önce belirlediğimiz kullanıcının bilgilerini çıkarır ve işlemi yürütmek için gerekli role sahip olup olmadığını kontrol eder. Bunun yanında, işlemin aynı kullanıcının yürütmesine izin vermesi durumunda, istek parametrelerindeki kimliğin aynı olduğunu doğrular.

Eğer kullanıcı gerekli role sahip değilse 403 yanıtı döndüreceğiz.

Bu iki yöntemle, isteklerin kimliğini doğrulayabilir ve gelen role bilgisine göre bunları yetkilendirebiliriz. Bu harika, ancak Firebase proje konsolundan özel talepler belirlememize izin vermediğinden , bu uç noktalardan hiçbirini yürütemeyeceğiz. Bunu atlamak için Firebase Authentication Console‘dan bir root kullanıcı oluşturabiliriz.

Firebase Authentication Console'dan bir root kullanıcı oluşturabiliriz.

Firebase Authentication Console’dan bir root kullanıcı oluşturabiliriz.

Şimdi geri kalan CRUD işlemlerini src/users/routes-config.ts dosyasına ekleyelim.

Tek bir kullanıcıyı getirme veya güncelleme işlemleri için id parametresinin gönderildiği yerde, aynı kullanıcının işlemi yürütmesine de izin veriyoruz.

Ve  src/users/controller.ts dosyası üzerinden devam ediyoruz. Bu işlemlerde, Firebase Authentication ile etkileşim kurmak ve ilgili işlemleri gerçekleştirmek için Admin SDK’sından (Yönetici SDK) yararlanıyoruz. Daha önce create operasyonda yaptığımız gibi, her işlemde anlamlı bir HTTP kodu döndürüyoruz.

Şimdi işlevi yerel olarak çalıştırabiliriz. Bunu yapmak için, önce yerel olarak kimlik doğrulama API’ına bağlanabilmek için hesap anahtarını ayarlamanız gerekir.

API Dağıtımı

Buraya kadar her şey güzeldi! Artık rol tabanlı bir API yazdığımıza göre, onu web’e dağıtabilir ve kullanmaya başlayabiliriz. Firebase ile dağıtım yapmak çok kolaydır, sadece firebase deploykomutunu çalıştırmamız gerekiyor. Dağıtım tamamlandığında, API’ye yayınlanan URL’den erişebiliriz.

firebase deploy

Firebase Deploy

API URL’nizi buradaki linkten kontrol edebilirsiniz: https://console.firebase.google.com/u/0/project/{ornek-projemiz}/functions/list

API Kullanımı

API’miz dağıtıldıktan sonra, onu kullanmanın birkaç yolu var. Ben bu makalede, Postman veya bir Angular uygulamasını ele alacağım.

Herhangi bir tarayıcıya Tüm Kullanıcıları Listele URL’sini (/api/users) girersek, aşağıdaki sonucu alırız:

Bunun nedeni, bir tarayıcıdan istek gönderirken, yetkilendirme başlıkları olmadan bir GET isteği gerçekleştirmemizdir. Bu, API’mizin aslında beklendiği gibi çalıştığı anlamına gelir! Yani tebrikler!

Angular ile Deneyelim!

Bu makalede, bir Angular uygulaması ile API’yi kullanmak için önemli olan kısımların üzerinden geçeceğim.

Oturum açmaya geri döndüğümüzde, kullanıcının bir kullanıcı adı ve şifre girmesine izin veren bir <form> içeren SignInComponent‘imiz olacak.

 

AngularFireAuth  hizmetini kullanarak signInWithEmailAndPassword ‘u kullanıyoruz.

 

Artık Firebase projemize giriş yapabilmeliyiz.

DevTools’taki ağ isteklerini incelediğimizde, Firebase’in kullanıcı ve şifremizi doğruladıktan sonra bir token döndürdüğünü görebiliriz. Bu token, başlığımızın isteğini oluşturduğumuz API’ye göndermek için kullanacağımız token’dir. Belirteci tüm isteklere eklemenin bir yolu, bir HttpInterceptor kullanmaktır.

Bu dosya, token’inAngularFireAuth‘tan nasıl alınacağını ve başlığın isteğine nasıl ekleneceğini gösterir.

http-interceptors/auth-token.interceptor.ts

app.module.ts

interceptor ayarlandıktan sonra, httpClient‘ten API’mize isteklerde bulunabiliriz. Örneğin UsersService, listeye tüm kullanıcılar adını verdiğimiz, kullanıcıyı kimliğine göre aldığımız, bir kullanıcı oluşturduğumuz ve bir kullanıcıyı güncellediğimiz yerdir.

 

Şimdi, oturum açmış kullanıcıyı kimliğine göre getirmek için API’yi çağırabilir ve aşağıdaki gibi bir bileşende tüm kullanıcıları listeleyebiliriz:

 

 

Bir role=user kullanıcısıyla oturum açarsak, yalnızca “Me” bölümünün işleneceğine dikkat edin.

Kullanıcı rolüne sahip kullanıcının erişebildiği kullanıcı kaynağının görünümü

Ve ağ denetçisinden bir 403 cevabı alacağız. Bunun nedeni, yalnızca “Yöneticilerin” tüm kullanıcıları listelemesine izin vermek için API üzerinde daha önce belirlediğimiz kısıtlamadır.

Ağ denetçisindeki bir 403 hatası

Şimdi “create user” ve “edit user” işlevlerini ekleyelim. Bunu yapmak için önce UserFormComponent ve UserFormService oluşturalım.

 

 

 

Ana bileşene geri dönelim, bu eylemleri çağırmak için butonları ekleyelim. Böylece, “Edit User” yalnızca oturum açmış kullanıcı için kullanılabilir olacaktır. İhtiyaç duyduğunuzda diğer kullanıcıları da düzenleme işlevini ekleyebilirsiniz.

 

 

Postman ile Deneyelim!

Postman, API’ler oluşturmak ve bunlara istekte bulunmak için kullanılan bir araçtır. Bu şekilde, API’mizi herhangi bir istemci  uygulamasından veya farklı bir hizmetten çağırdığımızı simüle edebiliriz. Deneme yapacağımız şey, tüm kullanıcıları listelemek için nasıl istek gönderileceğidir.

Aracı açtıktan sonra, URL’yi şu şekilde girebilirsiniz:  https://us-central1-{ornek-projemiz}.cloudfunctions.net/api/users

Bunun ardından, sekme yetkilendirmesinde Bearer Token‘ı seçiyoruz ve daha önce Dev Tools’tan çıkardığımız değeri belirliyoruz. İşte bu kadar!

Sonuç Olarak

Firebase’de kullanıcı rolü tabanlı API oluşturma konusunda kafanızda en azından bir şeylerin şekillendiğine inanıyorum. Ayrıca Angular ve Postman uygulamaları ile nasıl kullanılacağının üzerinde de durmuş olduk. Ama yine de önemli kısımların üzerinden geçmemiz gerektiğini düşünüyorum:

  1. Firebase, daha sonra genişletebileceğiniz, kurumsal düzeyde bir kimlik doğrulama API’si ile hızla çalışmaya başlamanıza olanak tanır.
  2. Hemen hemen her proje için yetkilendirme gerekir. Rol tabanlı bir model kullanarak erişimi kontrol etmeniz gerekiyorsa, Firebase Authentication çok hızlı bir şekilde başlamanıza olanak tanır.
  3. Rol tabanlı model, belirli kullanıcılara karşı belirli rollere sahip kullanıcılardan istenen kaynakların doğrulanmasına dayanır.
  4. Firebase Function üzerinde bir Express.js uygulaması kullanarak bir REST API oluşturabilir ve istekleri doğrulamak ve yetkilendirmek için işleyiciler ayarlayabiliriz.
  5. Yerleşik özel isteklerde yararlanarak, rol tabanlı bir kimlik doğrulama API’si oluşturabilir ve uygulamanızı güvenli hale getirebilirsiniz.

Firebase Auth, uygulamanızın (Google, Facebook, Twitter, GitHub vb.) birden çok sağlayıcıya kaydolmasına ve bir kullanıcının kimliğini doğrulamasına olanak tanıyan bir hizmettir. Firebase Auth, web, Android ve iOS ile kolayca entegre edebileceğiniz SDK’lar sağlar. Firebase Auth ayrıca bir REST API olarak da kullanılabilir.

Firebase, sunucusuz bir mobil veya web uygulamasını çok hızlı bir şekilde oluşturmanıza yardımcı olan bir bulut ürünleri paketidir. Her uygulamada yer alan yaygın hizmetlerin çoğunu sağlar (veritabanı, yetkilendirme, depolama, barındırma).

Firebase adresinde Google hesabınızla bir proje oluşturabilirsiniz. Proje oluşturulduktan sonra Firebase Auth’u açabilir ve uygulamanızda kullanmaya başlayabilirsiniz.

Firebase, Google destekli bir üründür ve Google’ın büyümeye ve daha fazla özellik eklemeye çalıştığı bir üründür. AWS Amplify, çoğunlukla mobil uygulamaları hedefleyen benzer bir üründür. Firebase daha fazla özelliğe sahip daha eski bir ürün olduğu için her ikisi de harika ürünlerdir.

Firebase, çok kolay bir şekilde başlayabileceğiniz ve büyütmeniz gerektiğinde altyapı konusunda endişelenmenize gerek kalmayan, tamamen yönetilen bir hizmettir. Nasıl çalıştığını hızlıca öğrenmek için birçok harika belge, örnekler ve bloglar var.

Firebase’in iki veritabanı vardır: Realtime Database ve Firestore. Her ikisi de benzer özelliklere ve farklı fiyatlandırma modellerine sahip NoSQL veritabanlarıdır. Firestore, daha iyi sorgulama özelliklerini destekler ve her iki veritabanı da, sorgu gecikmesinin veritabanı boyutundan etkilenmemesi için tasarlanmıştır.

 

Buraya kadar bana eşlik ettiğiniz için teşekkür ederim. Umarım aklınızda belirli bir şeyleri canlandırmayı başarabilmişimdir.

Keyifli Kodlamalar…

Kendinize İyi Bakın, Sağlıcakla Kalın!

 

 

 

Paylaşmak İster Misiniz?