Logto x Hasura: Erişim kontrolü için JWT kullanma
Bu kapsamlı rehber, Logto'yu Hasura'nın JWT modu erişim kontrolü ile entegre etmek için gereken adımları ayrıntılı olarak anlatıyor ve veri güvenliğini etkili bir şekilde artırıyor.
Hasura, verinize uygun GraphQL ve REST API'lerini hızla sağlayabilen bir araçtır. Veri güvenliğini göz önünde bulundurarak, Hasura ayrıca her farklı API için erişim kontrolünü ince ayarlarla yapma yeteneği sunar.
Genellikle, Hasura kullanıcıları diğer kimlik yönetimi ve kimlik doğrulama servislerini kullanır ve bunlar arasında Logto oldukça popülerdir.
Bu blog gönderisinde, Hasura hizmetlerini zaten kullandığınızı varsayacağız. Verilerinizin güvenliğini en üst düzeye çıkarmak için Hasura ve Logto'yu nasıl entegre edeceğinizi tanıtacağız. Eğer henüz bir Logto hesabınız yoksa, hemen kaydolun ve kullanmaya başlayın!
Arka plan
Hasura role-based access management (rol tabanlı erişim yönetimi) kullanırken, Logto, standart Role-based access control (RBAC) (rol tabanlı erişim kontrolü) kullanır.
Logto'nun modeli ve RBAC için en iyi uygulamaları çerçevesinde, kullanıcıların scope
(kapsam) kullanarak izinlerin en ince ayrıntısına kadar karşılık vermesini, role
(rol) kullanarak, toplu işlemler için bir dizi scope
tanımlamasını; ve sonunda, kullanıcının belirli bir işlemi yapıp yapamayacağını doğrulamak için scope
kontrolü yapmasını öneriyoruz (genellikle kaynak sağlayıcıların tarafında).
Hasura’da, bir role
, izinlerin en ince ayrıntısına karşılık gelir ve izin kontrolleri role
üzerinden gerçekleştirilir. Bu nedenle, Logto'nun yapılandırması sırasında, bir role
ü tam olarak bir scope
ile eşleştirmenizi öneririz. Bu yaklaşım, Logto’nun ve Hasura’nın izinlerini bir araya getirebilir ve karmaşıklığı önleyebilir.
Hasura, Webhooks veya JWT kullanarak erişim kontrolünü destekleyebilir. Önceki blog gönderimizde Webhooks kullanımını tanıttık; aşağıdaki bölümlerde ise Hasura’nın JWT modu erişim kontrolünü nasıl kullanacağınızı açıklayacağız.
Başlarken
Basit bir örnekle başlayalım. Diyelim ki bir kullanıcı Hasura’da iki API'ye sahiptir: GET /user
ve PATCH /user
, bunlar sırasıyla user:reader
ve user:maintainer
rollerine karşılık gelmektedir.
1. Logto'da Hasura API kaynağı oluşturun
Logto'da bir Hasura API kaynağı oluşturun.
2. Hasura yapılandırmasına göre Logto'da roller oluşturun
- adımda bahsedilen Hasura API kaynağı için iki
scope
oluşturmamız gerekiyor:read:user
vemaintain:user
. Ardından, buscope
leri içeren iki rol oluşturacağız:user:reader
(read:user
kapsamını içeren) veuser:maintainer
(maintain:user
kapsamını içeren), bu rolleri Hasura’nın rollerine birebir karşılık gelecek şekilde yapılandıracağız. Ve bu rolleri gerektiği gibi Logto kullanıcılarına atayın.
3. Hasura ortam değişkeni HASURA_GRAPHQL_JWT_SECRET
i yapılandırarak JWT modunu etkinleştirin
Hasura JWT yapılandırma seçeneklerini inceleyerek, JWT'yi erişim kontrolü için kullanmadan önce HASURA_GRAPHQL_JWT_SECRET
ortam değişkenini eklemeniz ve yapılandırmanız gerektiğini görebiliriz.
Yapılandırılabilecek birçok farklı seçenek vardır, ancak burada en basit durumu tanıtacağız: sadece jwk_url
yapılandırılmalıdır. Bu değer, Logto'nuzun OpenID yapılandırma noktasından (https://your.logto.domain/oidc/.well-known/openid-configuration) elde edilebilir.
4. Kullanıcı erişim jetonunun ekstra iddialarını özelleştirin
Logto’nun Özel JWT özelliğini kullanarak, JWT formatındaki kullanıcı erişim jetonuna ekstra iddialar eklemek için mantığı özelleştirin.
getCustomJwtClaims
yöntemini özelleştirerek Hasura'nın erişim kontrolünü uygulamak için güvendiği JWT'ye veri ekleyin. Bu, yetkilendirilen kullanıcının o anki kimliğine ilişkin veriler, sahip olduğu role
ler gibi, context
(bağlam) üzerinden erişilebilecek verileri içerebilir.
Ayrıca, sabit kodlamayı önlemek için bir ortam değişkeni USER_DEFAULT_ROLE_NAMES
tanımladık.
5. Logto SDK'sını entegre edin
Logto ve Hasura yapılandırmasını tamamladıktan sonra uygulamanızı Logto SDK'sı ile entegre edin. Burada, kullanıcının oturum açmasından sonra Logto tarafından verilen kullanıcı erişim jetonunu önizlemek için bir Next örneği kullanacağız.
İlk olarak, önceki adımlarda oluşturulan user:reader
ve user:maintainer
rollerini kullanıcıya atayın ve ardından bu kullanıcıyla oturum açın.
Kullanıcı erişim jetonu alın ve Hasura API'lerine istek gönderin:
Sonuç
Bu makalede, Hasura’nın Webhook dışında desteklediği JWT tabanlı erişim kontrolü yöntemini sunduk.
Hasura’nın Webhook ve JWT erişim kontrolü süreçlerini karşılaştırarak, Webhook yaklaşımının her Hasura isteğinde Logto’ya bir Webhook gönderdiğini ve bir yanıt beklediğini; JWT tabanlı yaklaşımın ise JWT süresi dolana kadar sürekli olarak kullanılabildiğini görebiliriz.
JWT yaklaşımı ağ yükünü azaltabilir ve Webhook'ların getirdiği ağ gecikmesini ortadan kaldırabilir; bu arada, Webhook yaklaşımı kullanıcı izinlerindeki değişiklikleri gerçek zamanlı olarak senkronize edebilir.
Kullanıcılar bu sonuçlara dayanarak ve kendi gerçek iş ihtiyaçlarıyla birlikte uygun yöntemi seçebilirler.