Keycloak Server ile API’larınıza JWT Validasyonu Nasıl Ekleyebilirsiniz? – Bölüm 1
  1. Anasayfa
  2. Microsoft Azure

Keycloak Server ile API’larınıza JWT Validasyonu Nasıl Ekleyebilirsiniz? – Bölüm 1

0

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

www.mshowto.org

Keycloak – Getting started

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

Bu İçeriğe Tepkin Ne Oldu?
  • 17
    harika_
    Harika!!
  • 2
    be_enmedim
    Beğenmedim
  • 2
    _ok_iyi
    Çok iyi
  • 1
    sevdim_
    Sevdim!
  • 3
    bilemedim_
    Bilemedim!
  • 0
    olmad_
    Olmadı!
  • 0
    k_zd_m_
    Kızdım!

Mert Yeter, lisans eğitimini Yıldız Teknik Üniversitesi'nde, yüksek lisans eğitimini ise Bahçeşehir Üniversitesi'nde tamamlamıştır. Yazılım dünyasına üniversitenin ilk yıllarında aldığı QBasic ile başlayan Mert, .NET ve SQL Server gibi Microsoft teknolojileri ile devam etmiş; yüksek lisans tezini ise Linux konusunda yapmıştır. Netaş ve Ziraat Teknoloji gibi sektörün önde gelen firmalarında C#, .NET, SQL Server, Cisco Contact Center ürünleri ve Linux üzerine çalışmış, bir çok firmaya da bu konularda danışmanlık vermiştir.

Yazarın Profili

Bültenimize Katılın

Tıklayın, üyemiz olun ve yeni güncellemelerden haberdar olan ilk kişi siz olun.

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir