Keycloak Nedir ve Django ile Nasıl Entegre Edilir? (Örnek Proje Rehberi) Modern web uygulamaları geliştirirken kullanıcı kimlik doğrulama (authentication) ve yetkilendirme (authorization) sü...
Keycloak Nedir ve Django ile Nasıl Entegre Edilir? (Örnek Proje Rehberi)
Modern web uygulamaları geliştirirken kullanıcı kimlik doğrulama (authentication) ve yetkilendirme (authorization) süreçleri projenin en kritik parçalarından biridir. Her proje için ayrı bir kullanıcı veritabanı, şifre sıfırlama akışı veya iki aşamalı doğrulama (2FA) yazmak hem zaman kaybıdır hem de güvenlik riskleri barındırır.
İşte tam bu noktada Keycloak devreye girer. Bu yazıda Keycloak'un ne olduğunu inceleyecek ve popüler Python çatısı Django ile nasıl entegre edileceğini adım adım göreceğiz.
1. Keycloak Nedir?
Keycloak, modern uygulamalar ve servisler için açık kaynaklı, merkezi bir Kimlik Yönetimi ve Erişim Kontrolü (IAM) sistemidir. Red Hat tarafından geliştirilen bu araç; Tek Oturum Açma (SSO - Single Sign-On), kimlik federasyonu (Google, GitHub, LDAP ile giriş vb.) ve kullanıcı yönetimi gibi işlemleri merkezi olarak yönetmenizi sağlar.
Keycloak'un Sağladığı Başlıca Avantajlar:
-
Tek Noktadan Yönetim: Tüm uygulamalarınızın kullanıcıları tek bir havuzda toplanır.
-
Açık Standartlar: OpenID Connect (OIDC) ve OAuth 2.0 gibi endüstri standardı protokolleri destekler.
-
Hazır Arayüzler: Giriş, kayıt, şifre sıfırlama ve profil yönetimi için hazır, özelleştirilebilir ekranlar sunar.
-
Güvenlik: Şifre politikaları, brute-force koruması ve iki aşamalı doğrulama (2FA/OTP) gibi güvenlik katmanlarını kod yazmadan yapılandırmanıza olanak tanır.
2. Django ile Keycloak Entegrasyonu (Örnek Proje Mimarisi)
Django, yerleşik bir kimlik doğrulama sistemine sahip olsa da, kurumsal yapılarda veya mikroservis mimarilerinde dışarıdan bir kimlik sağlayıcıya (Identity Provider - IdP) bağlanmak gerekir. Django'yu Keycloak ile konuşturmak için en yaygın yöntem OpenID Connect (OIDC) protokolünü kullanmaktır.
Bu entegrasyon için
mozilla-django-oidc kütüphanesini kullanacağız.Adım 1: Keycloak Tarafında Hazırlık
-
Keycloak yönetim panelinde (Admin Console) yeni bir Realm oluşturun (Örn:
blog-realm). -
Bu realm içinde yeni bir Client oluşturun (Örn:
django-app). -
Client ayarlarında
Access Typedeğeriniconfidentialyapın ve uygulamanızın yönlendirme (Redirect URI) adresini tanımlayın (Örn:http://localhost:8000/oidc/callback/). -
Credentialssekmesinden üretilen Client Secret değerini güvenli bir yere not edin.
Adım 2: Django Projesine Kütüphane Kurulumu
Projenize terminal üzerinden
mozilla-django-oidc paketini kurun:pip install mozilla-django-oidc
Adım 3: Django settings.py Ayarları
Keycloak ile haberleşebilmek için
settings.py dosyasına OIDC parametrelerini ekleyin:INSTALLED_APPS = [
# ...
'mozilla-django-oidc',
]
AUTHENTICATI
'mozilla-django-oidc.auth.OIDCAuthenticationBackend',
'django.contrib.auth.backends.ModelBackend',
]
# Keycloak Bilgileri
OIDC_RP_CLIENT_ID = 'django-app'
OIDC_RP_CLIENT_SECRET = 'KEYCLOAK_CLIENT_SECRET_BURaya_YAZILACAK'
OIDC_OP_AUTHORIZATI class="hljs-string">'http://localhost:8080/realms/blog-realm/protocol/openid-connect/auth'
OIDC_OP_TOKEN_ENDPOINT = 'http://localhost:8080/realms/blog-realm/protocol/openid-connect/token'
OIDC_OP_USER_ENDPOINT = 'http://localhost:8080/realms/blog-realm/protocol/openid-connect/userinfo'
# Giriş ve Çıkış Yönlendirmeleri
LOGIN_URL = '/oidc/authenticate/'
LOGIN_REDIRECT_URL = '/'
LOGOUT_REDIRECT_URL = '/'
Adım 4: URL Yönlendirmelerini Ekleme
Ana
urls.py dosyanıza OIDC rotalarını dahil edin:from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('oidc/', include('mozilla_django_oidc.urls')),
]
Bu yapılandırma tamamlandığında, kullanıcılar Django projelerinde korumalı bir sayfaya girmek istediklerinde otomatik olarak Keycloak’un şık giriş ekranına yönlendirilirler. Giriş başarılı olduğunda Keycloak, kullanıcıyı Django'ya geri gönderir ve Django arka planda bu kullanıcıyı veritabanında eşler veya oluşturur.
Keycloak kullanarak Django projelerinizde kimlik doğrulama yükünü sıfıra indirebilir, uygulamanızı kurumsal standartlarda güvenlik özellikleriyle donatabilirsiniz. Birden fazla uygulamanız varsa, kullanıcıların tek bir hesapla hepsine giriş yapabilmesi (SSO) büyük bir kullanıcı deneyimi avantajı sağlar.
Keycloak'u Docker üzerinde ayağa kaldırmayı ve ardından Django projesinde Rol Bazlı Yetkilendirme (RBAC - Role-Based Access Control) senaryolarını nasıl kurgulayacağınızı adım adım inceleyelim.
Bölüm 1: Keycloak'u Docker Üzerinde Ayağa Kaldırma
Keycloak'u yerel ortamınızda test etmek ve hızlıca ayağa kaldırmak için en pratik yol Docker kullanmaktır.
Proje dizininizde bir
docker-compose.yml dosyası oluşturun ve aşağıdaki yapılandırmayı ekleyin:version: '3.8'
services:
postgres:
image: postgres:15-alpine
container_name: postgres_keycloak
environment:
POSTGRES_DB: keycloak
POSTGRES_USER: keycloak
POSTGRES_PASSWORD: password123
volumes:
- postgres_data:/var/lib/postgresql/data
networks:
- keycloak-net
keycloak:
image: quay.io/keycloak/keycloak:24.0.1
container_name: keycloak_server
environment:
KC_DB: postgres
KC_DB_URL: jdbc:postgresql://postgres:5432/keycloak
KC_DB_USERNAME: keycloak
KC_DB_PASSWORD: password123
KEYCLOAK_ADMIN: admin
KEYCLOAK_ADMIN_PASSWORD: adminpassword
command: start-dev
ports:
- "8080:8080"
depends_on:
- postgres
networks:
- keycloak-net
volumes:
postgres_data:
networks:
keycloak-net:
driver: bridge
Terminalde bu dosyanın bulunduğu dizinde şu komutu çalıştırarak servisleri başlatın:
Bash
docker compose up -d
-
Keycloak ayağa kalktıktan sonra tarayıcınızdan
http://localhost:8080adresine gidebilir,admin/adminpasswordbilgileriyle yönetim paneline giriş yapabilirsiniz.
Bölüm 2: Keycloak Tarafında Roller ve Client Yapılandırması
Django'da yetkilendirme yapabilmek için Keycloak tarafında roller tanımlamamız ve bunları kullanıcıya atamamız gerekir.
-
Realm Oluşturma: Keycloak panelinde sol üstten yeni bir Realm oluşturun (Örn:
blog-realm). -
Client Oluşturma:
Clientsmenüsünden yeni bir client ekleyin:
-
Client ID:
django-blog-app -
Client Authentication:
On(Confidential) -
Valid Redirect URIs:
http://localhost:8000/oidc/callback/
-
-
Rol Tanımlama (Roles):
-
Oluşturduğunuz client'ın içine girin ve Client Roles sekmesinden şu iki rolü oluşturun:
-
editor -
admin
-
-
-
Kullanıcıya Rol Atama:
-
Usersmenüsünden bir kullanıcı oluşturun. -
Kullanıcının detay sayfasında Role mapping sekmesine gidin ve oluşturduğunuz
editorveyaadminrolünü kullanıcıya atayın.
-
Bölüm 3: Django'da Rol Bazlı Yetkilendirme (RBAC) Entegrasyonu
Keycloak, kullanıcı giriş yaptığında JWT (JSON Web Token) veya kullanıcı bilgileriyle birlikte bu rolleri Django'ya iletir.
mozilla-django-oidc kullanarak bu rolleri Django'nun kendi grup/yetki sistemine map'leyebilir veya özel bir backend yazabiliriz.1. Özel OIDC Backend ile Rolleri Django'ya Aktarma
Django'nun kullanıcıyı oluştururken veya güncellerken Keycloak'tan gelen rolleri okumasını sağlamak için
mozilla-django-oidc yapılandırmasını özelleştirebiliriz.Projenizde (örneğin
accounts/backends.py içinde) şu sınıfı yazın:from mozilla_django_oidc.auth import OIDCAuthenticationBackend
class KeycloakOIDCAuthenticationBackend(OIDCAuthenticationBackend):
def create_user(self, claims):
user = super().create_user(claims)
self.update_user_roles(user, claims)
return user
def update_user(self, user, claims):
self.update_user_roles(user, claims)
return user
def update_user_roles(self, user, claims):
"""
Keycloak token/claim içerisinden gelen rolleri okur
ve Django grup/yetki sistemine işler.
"""
# Keycloak JWT yapısına göre roller genelde resource_access içinde gelir
resource_access = claims.get('resource_access', {})
client_access = resource_access.get('django-blog-app', {})
roles = client_access.get('roles', [])
# Örnek: 'admin' rolüne sahipse Django is_staff yapalım
if 'admin' in roles:
user.is_staff = True
user.is_superuser = True
else:
user.is_staff = False
user.is_superuser = False
user.save()
2. settings.py Güncellemesi
Özel Authentication Backend'imizi
settings.py dosyasına tanımlayın:AUTHENTICATI
'accounts.backends.KeycloakOIDCAuthenticationBackend', # Özel backend
'django.contrib.auth.backends.ModelBackend',
]
# Claims içerisinden rollerin düzgün okunabilmesi için OIDC ayarları (gerekirse ek scopes)
OIDC_RP_SIGNATURE_ALGO = 'RS256'
OIDC_OP_JWKS_ENDPOINT = 'http://localhost:8080/realms/blog-realm/protocol/openid-connect/certs'
3. Django Görünümlerinde (Views) Rol Kontrolü
Artık standart Django decorators veya mixin yapılarını kullanarak roller üzerine kısıtlamalar getirebilirsiniz.
-
Fonksiyon Bazlı Görünümlerde (Function-based views):
from django.contrib.auth.decorators import user_passes_test from django.shortcuts import render def is_editor(user): return user.is_authenticated and (user.is_staff or user.groups.filter(name='editor').exists()) @user_passes_test(is_editor) def blog_yonetim_paneli(request): return render(request, 'blog/admin_panel.html') -
Sınıf Bazlı Görünümlerde (Class-based views):
from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin from django.views.generic import TemplateView class ArticleCreateView(LoginRequiredMixin, UserPassesTestMixin, TemplateView): template_name = 'blog/article_create.html' def test_func(self): # Sadece admin veya editor rolündekiler erişebilir return self.request.user.is_staff
Özet Senaryo Akışı
-
Kullanıcı Django'da korumalı bir sayfaya gider ve Keycloak'a yönlendirilir.
-
Keycloak üzerinde
editorrolüne sahip kullanıcı başarıyla giriş yapar. -
Keycloak, Django'ya kullanıcı bilgilerini ve rollerini iletir.
-
KeycloakOIDCAuthenticationBackendsınıfımız bu rolleri yakalar ve kullanıcının yetkilerini (örn.is_staff = True) günceller. -
Django,
@user_passes_testveyaUserPassesTestMixinyardımıyla kullanıcının sayfaya erişimine izin verir.