Türkçe
  • hasura
  • restful api
  • graphql
  • logto
  • custom jwt
  • erişim kontrolü
  • yetkilendirme

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.

Darcy Ye
Darcy Ye
Developer

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.

Hasura API

2. Hasura yapılandırmasına göre Logto'da roller oluşturun

  1. adımda bahsedilen Hasura API kaynağı için iki scope oluşturmamız gerekiyor: read:user ve maintain:user. Ardından, bu scopeleri içeren iki rol oluşturacağız: user:reader ( read:user kapsamını içeren) ve user: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.

Hasura API with scopes

User reader role

User maintainer role

3. Hasura ortam değişkeni HASURA_GRAPHQL_JWT_SECRETi 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.

Hasura JWT config

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.

User access token script

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 roleler 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.

User with roles

İ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.