Web API güvenliği denildiğinde ilk akla gelen yöntemlerden biri olan JSON Web Token ya da kısa adıyla JWT, artık bütün yazılımcıların yakından tanıdığı ve kullandığı bir yöntem. JWT üretmek için ise kendi uygulamanızı yazabileceğiniz gibi, mevcuttaki açık kaynak ürünleri de tercih edebilirsiniz. Bu yazıda ise Red Hat Single Sign-on‘un açık kaynak versiyonu olan; Security Assertion Markup Language (SAML) 2.0, OpenID Connect, ve OAuth 2.0 gibi standartları destekleyen Keycloak‘tan bütün detaylara girmeden kısaca bahsedip, geliştirme ortamlarınızda bunu nasıl hızlıca kullanabileceğinizi anlatmaya çalışacağım.
Keycloak kurulumu için bir çok alternatif mevcut, ancak tercihinize göre kendi bilgisayarınızda, sunucu ortamında ya da Azure üzerinde tek bir dosya ile bunu sağlamanın bir yolu var, Docker Compose :) Örneği hala preview görünse de Docker Compose desteğini kullanarak yapacağım.
İlk olarak yeni bir web app oluşturacağım. Burada Resim-1‘de göreceğiniz gibi standart ayarları yaparak başlıyorum. Sku and size değerini biraz yüksek seçmemin bir sebebi de sadece Keycloak container’ını değil, veri tabanı için bir Postgres container da kullanacağım. Eğer harici bir veri tabanı set etmezseniz, kendi içerisinde yer alan Java tabanlı bir ilişkisel veri tabanı olan H2 veri tabanını kullanıyor.
Resim-1
Docker sekmesinde ise Resim-2‘de göreceğiniz gibi Docker Compose seçeğini seçip ilgili ayarları yapıyorum.
Resim-2
Aşağıda yer alan docker-compose.yml dosyasını upload ederek devam edeceğim. Burada daha önce bahsettiğim gibi biri keycloak diğeri de postgres olmak üzere 2 adet container var ve verileri restart sonrasında kaybetmemek için basit bir de volume tanımı yer alıyor:
version: '3.4' services: postgres: image: postgres container_name: keycloak-db volumes: - postgresql:/var/lib/postgresql - postgresql_data:/var/lib/postgresql/data keycloak: image: jboss/keycloak container_name: keycloak-server ports: - 8080:8080 depends_on: - postgres volumes: postgresql: postgresql_data:
App Service’i oluşturduktan sonra yapmam gereken bir işlem daha var. Docker Compose üzerinde eksikliğibi göreceğiniz gibi bu iki container’ı birbiri ile ilişkilendiren ya da kendileri ile ilgili herhangi bir config yer almıyor. Bunları da environment değişkenlerinden almaları için App Service üzerine Settings/Configuration sekmesinden ekleyeceğim (Resim-3).
Resim-3
Buraya eklenen değerleri aşağıdaki gibi Advanced edit altından ekleyebilirsiniz.
[ { "name": "DB_ADDR", "value": "postgres", "slotSetting": false }, { "name": "DB_DATABASE", "value": "keycloak-db", "slotSetting": false }, { "name": "DB_PASSWORD", "value": "mshowto123!", "slotSetting": false }, { "name": "DB_SCHEMA", "value": "public", "slotSetting": false }, { "name": "DB_USER", "value": "keycloak", "slotSetting": false }, { "name": "DB_VENDOR", "value": "POSTGRES", "slotSetting": false }, { "name": "DOCKER_REGISTRY_SERVER_PASSWORD", "value": "", "slotSetting": false }, { "name": "DOCKER_REGISTRY_SERVER_URL", "value": "https://index.docker.io", "slotSetting": false }, { "name": "DOCKER_REGISTRY_SERVER_USERNAME", "value": "", "slotSetting": false }, { "name": "KEYCLOAK_FRONTEND_URL", "value": "https://mshowto-keycloak.azurewebsites.net/auth", "slotSetting": false }, { "name": "KEYCLOAK_PASSWORD", "value": "keycloak123!", "slotSetting": false }, { "name": "KEYCLOAK_USER", "value": "mshowto", "slotSetting": false }, { "name": "POSTGRES_DB", "value": "keycloak-db", "slotSetting": false }, { "name": "POSTGRES_PASSWORD", "value": "mshowto123!", "slotSetting": false }, { "name": "POSTGRES_USER", "value": "keycloak", "slotSetting": false }, { "name": "WEBSITES_ENABLE_APP_SERVICE_STORAGE", "value": "false", "slotSetting": false } ]
Bu ekleme işlemlerini tamamlayıp kaydettikten sonra servisi restart etse de benim gibi tekrar restart etmek de isteyebilirsiniz. Restart sonrası appsettings’e de eklediğimiz App Service url’ine gittiğimizde aşağıda göreceğiniz ana ekran gelecek.
Resim-4
Burada Administration Console‘a tıkladığımızda ise Resim-5‘te göreceğiniz giriş ekranı gelecek ve appsettings altında tanımladığım kullanıcı adı ve şifreyi girerek devam edeceğim.
Resim-5
Ana ekranda varsayılan olan gelen ve Master adında gördüğünüz varsayılan Realm, yani tenant. Ben yeni bir tane oluşturmak istiyorum ve Add realm butonuna basıyorum (Resim-7)
Resim-7
Burada az bir seçenek mevcut, sadece isim girip Create butonuna basacağım.
Resim-8
Bu örnekte grant type olarak client credentials kullanacağım için client tanımı dışında bir user tanımı yapmayacağım. Eğer grant type password kullanmak isterseniz Users altından bir de kullanıcı tanımı yapmanız gerekecek. Clients sekmesine gelip burada Create butonuna basarak yeni bir client eklemek istiyorum (Resim-9).
Resim-9
Client ekleme ekranında da çok fazla seçenek bulunmuyor. Client ID ve Root URL (App Service url) tanımı yaptıktan sonra client protocol değerini openid-connect olarak bırakıyorum.
Resim-10
Client settings’te ise Access Type değerini confidential ve Service Accounts Enabled değerini de On olarak değiştiriyorum.
Resim-11
Aynı sayfada aşağıda yer alan Advanced Settings altından Access Token Lifespan değerini 20 dk olarak güncelliyorum. Authentication Flow Overrides altındaki Browser Flow ve Direct Grant Flow değerlerini de Resim-12‘de göreceğiniz şekilde seçiyorum.
Resim-12
Save butonuna basarak ayarları kaydettikten sonra, Credentials sekmesine gelip burada yer alan ve oken isteği sırasında kullanacağım Secret değerini not alıyorum (Resim-13).
Resim-13
JWT içerisinde audience, claim vb bir çok kısım bulunuyor, şimdilik bu kısımlara girmeden Postman ile bir token alabiliyor muyum test etmek için oluşturduğum client id ve Resim-13‘teki client secret değerlerini Resim-14‘te göreceğiniz şekilde https://mshowto-keycloak.azurewebsites.net/auth/realms/mshowto/protocol/openid-connect/token adresine POST isteği olarak gönderiyorum ve bir access token alabiliyorum.
Resim-14
2. bölümde ise uygulama tarafında nasıl ilerleyeceğimi .NET 6 Minimal API üzerinden anlatmaya çalışacağım.
Bu konuyla ilgili sorularınızı alt kısımda bulunan yorumlar alanını kullanarak sorabilirsiniz.
Referanslar
API login and JWT token generation using Keycloak | Red Hat Developer
TAGs: Azure, Yazılım Geliştiriciler için Azure, Containers, Azure Web App, DevOps, Docker Compose, Docker, Keycloak, Postgres, JWT, Authentication, Postman, Web API, REST, SAML, OpenID, OAuth