Express.js API'nizi JWT ve Logto ile Koruyun
Express.js API uç noktalarınızı JSON Web Token (JWT) ve Logto ile nasıl koruyacağınızı öğrenin.
Giriş
Bir web uygulaması geliştirirken, API uç noktalarınızı yetkisiz erişimlere karşı korumanız çok önemlidir. Diyelim ki çevrimiçi bir alışveriş sitesi kuruyorsunuz; siber hırsızların API'nizi istismar etmesini kesinlikle istemezsiniz.
Kullanıcıların belirli eylemleri gerçekleştirmeden önce oturum açması gereken bir kullanıcı kimlik doğrulaması ile bir Express.js uygulaması geliştirdiğinizi varsayalım. Değilse, Logto ile yolculuğunuza başlayabilirsiniz. Kullanıcı kimlik doğrulama akışını oluşturmak için sadece birkaç satır koda ihtiyaç duyarsınız.
Ancak kullanıcı kimlik doğrulamasından sonra bile, API uç noktalarınızı korumak için çeşitli seçeneklerle karşılaşırsınız. Maalesef, bu seçeneklerin çoğunun dezavantajları vardır:
- Oturum tabanlı kimlik doğrulama: API'nizi bir oturum deposuna bağlamak, ölçeklenebilir değildir ve mikro hizmetlere uygun değildir.
- Bir kimlik doğrulama hizmeti çağırmak: Bu, ekstra bir ağ çağrısı gerektirir, gecikme ve maliyetleri artırır. Bazı kimlik doğrulama hizmetleri, API çağrı hacmine göre ücret alır ve bu da önemli maliyetlere yol açabilir.
Bu eğitimde, JSON Web Tokens (JWT) ve Logto kullanarak API uç noktalarınızı nasıl güçlendirebileceğinizi göstereceğiz. Bu yaklaşım, ölçeklenebilirlik ve minimal ek maliyetler sunar.
Ön Koşullar
Başlamadan önce, aşağıdakilere sahip olduğunuzdan emin olun:
- Bir Logto hesabı. Eğer yoksa, ücretsiz kaydolabilirsiniz.
- API korumasına ihtiyaç duyan bir Express.js projesi ve API'yi tüketen bir istemci uygulaması.
- JSON Web Token (JWT) ile ilgili temel bilgilere aşinalık.
Logto'da API kaynağınızı tanımlayın
Logto, API uç noktalarınızı güvence altına almak için RFC 8707: OAuth 2.0 için Kaynak Göstergeleri'ndan tam anlamıyla yararlanır. Bu, API kaynaklarınızı gerçek URL'leriyle tanımlayabileceğiniz anlamına gelir.
Logto Konsolunda "API kaynakları" sekmesine gidin ve yeni bir kaynak oluşturmak için "API kaynağı oluştur" üzerine tıklayın. Örneğin, /api/products
uç noktasını korumak istiyorsanız, https://yourdomain.com/api/products
URL'sini tanımlayıcı olarak kullanabilirsiniz.
İstemci uygulamanızda bir erişim tokenı alın
Devam etmek için, Logto SDK'sını istemci uygulamanıza entegre etmeniz gerekecek. Bu uygulama, Express.js arka ucunuzdan farklı olabilir; örneğin, arka uç API sunucusu olarak Express.js kullanan bir React uygulamanız olabilir.
Bu izni talep etmek için Logto SDK yapılandırmasını, API'niz için bir erişim tokenı talep etmek istediğinizi Logto'ya bildirecek şekilde ayarlamanız gerekecek. İşte React kullanan bir örnek:
Kullanıcı Logto ile oturum açtığında, Logto SDK'sı içindeki isAuthenticated
true
olur:
Artık getAccessToken
metodunu kullanarak API'niz için bir erişim tokenı alabilirsiniz:
Son olarak, API'ye istek gönderirken bu erişim tokenını Authorization
başlığına dahil edin:
API'nizde erişim tokenını doğrulayın
Express.js uygulamanızda, JWT doğrulaması için jose
kütüphanesini kurun:
Bearer kimlik doğrulamasını kullandığımız için, erişim tokenını Authorization
başlığından çıkarın:
Daha sonra, erişim tokenını doğrulamak için bir ara yazılım oluşturun:
Artık bu ara yazılımı kullanarak API uç noktalarınızı koruyabilirsiniz:
Bu yaklaşımla, her istekte Logto sunucusuyla iletişim kurmanıza gerek kalmaz. Bunun yerine, Logto sunucusundan JSON Web Key Set (JWKS) bir kerelik alır ve ardından erişim tokenlarını yerel olarak doğrularsınız.
Rol tabanlı erişim kontrolü
Bu noktaya kadar, sadece kullanıcının Logto ile oturum açtığını doğruladık. Henüz kullanıcının API uç noktasına erişim iznine sahip olup olmadığını bilmiyoruz. Bunun nedeni, Logto'nun herhangi birine mevcut bir API kaynağı için erişim tokenı almasına izin vermesidir.
Bunu ele almak için, rol tabanlı erişim kontrolü (RBAC) kullanabiliriz. Logto'da, roller tanımlayıp onlara izinler atayabilirsiniz. Logto'da roller ve izinlerin nasıl tanımlanacağını öğrenmek için bu öğreticiyi inceleyin.
Rolleri ve izinleri tanımladıktan sonra, LogtoProvider
bileşenine scopes
seçeneğini ekleyebilirsiniz:
Logto daha sonra uygun kapsam(lar) ile kullanıcılara erişim tokenı verecektir. Örneğin, bir kullanıcı yalnızca read:products
kapsamına sahipse, erişim tokenı yalnızca bu kapsamı içerecektir:
Bir kullanıcı hem read:products
hem de write:products
kapsamlarına sahipse, erişim tokenı her iki kapsamı da içerir ve bir boşluk karakteriyle birbirinden ayrılır:
Express.js uygulamanızda, API uç noktasına erişim yetkisi vermeden önce erişim tokenının doğru kapsam(ları) içerip içermediğini doğrulayabilirsiniz:
Sonuç
API uç noktalarını korurken aynı zamanda ölçeklenebilirliği sağlamak göz korkutucu bir görev olabilir. Logto'da, geliştiriciler için istek kimlik doğrulamasını basitleştirmeyi amaçlıyoruz, böylece iş mantığınıza daha fazla odaklanabilirsiniz.
Herhangi bir sorunuz varsa, Discord sunucumuza katılmaktan çekinmeyin. Topluluğumuz sizi her zaman yardımcı olmaktan mutluluk duyar.