Realm metadata UNREACHABLE (BaseUrl vs PublicBaseUrl)
Realm metadata UNREACHABLE (BaseUrl vs PublicBaseUrl)
Console’da şuna benzer satır:API,
BaseUrl’e ulaşamıyor demektir. JWKS alınamazsa tüm token doğrulama IDX10500 ile patlar.Çözüm:- Docker dev’de API container’ı Keycloak’a iç ağ hostname’i ile ulaşmalı (
BaseUrl = http://diyanet-keycloak:8080),localhostdeğil — container içindelocalhostAPI’nin kendisidir. - Aynı anda tarayıcının gördüğü URL
PublicBaseUrl = http://localhost:8080olmalı. - Test:
docker exec diyanet-api curl -s http://diyanet-keycloak:8080/realms/diyanet-yonetim-dev-realm/.well-known/openid-configuration
Issuer mismatch (internal vs public issuer)
Issuer mismatch (internal vs public issuer)
Token reddediliyor; Çözüm:
X-Auth-Fail-... header’ında issuer hatası. Sebep: token’ın iss’i
(PublicBaseUrl) ile API’nin beklediği issuer (BaseUrl) farklı.Sistem her ikisini de kabul edecek şekilde tasarlandı:PublicBaseUrl’ü token’ın gerçek iss’iyle birebir aynı yapın. iss’i jwt.io ile
okuyun; appsettings’teki PublicBaseUrl + /realms/{Realm} bununla eşleşmeli. Sondaki /
farkı bile mismatch yaratır.Invalid audience
Invalid audience
SecurityTokenInvalidAudienceException. Token’ın aud’u kabul edilen değerlerle eşleşmiyor.Kabul edilenler: client ID ve Keycloak’ın account audience’ı:appsettings→Keycloak:*:ClientIdile token’dakiaudaynı olmalı (diyanet-website/diyanet-admin).- Geçici teşhis için
ValidateAudience: falseyapılabilir ama prod’da açık tutun.
PKCE / redirect URI hatası
PKCE / redirect URI hatası
Keycloak login sonrası
Invalid parameter: redirect_uri veya PKCE hatası.Çözüm:- Client’ın Valid redirect URIs listesi SPA origin’ini içermeli:
http://localhost:3000/*(website),http://localhost:3001/*(admin) ve Swagger içinhttp://localhost:5005/swagger/oauth2-redirect.html. - Web origins SPA origin’ini içermeli (CORS).
- Client public +
PkceRequired: true+ methodS256olmalı; SPAkeycloak-jsile PKCE gönderiyor olmalı.
Token süresi — personel 5 dakikada 401
Token süresi — personel 5 dakikada 401
Personel token’ı bilinçli olarak 5 dakikadır (
AccessTokenLifespanSeconds: 300). Süre dolunca
401 ve Token-Expired: true header’ı gelir.Çözüm: Bu beklenen davranıştır. SPA refresh token rotation ile (lifespan 1800 sn) sessizce
yeniler. 5 dakikada bir login’e düşüyorsanız refresh akışınızı kontrol edin; refresh token süresi
de dolmuşsa yeniden login gerekir. Saat kayması için 30 sn ClockSkew toleransı vardır.Her endpoint 403 — account_status / MapInboundClaims
Her endpoint 403 — account_status / MapInboundClaims
Authenticated görünüyorsunuz ama her şey 403.Olası sebep:
MapInboundClaims açık kalmış → sub claim’i yeniden adlandırılmış →
UserContextClaimsTransformation sub’u bulamaz → account_status="Unknown" →
ActiveAccountRequirement fail.Çözüm: ConfigureScheme’te options.MapInboundClaims = false olduğundan emin olun. Ayrıca
kullanıcının DB’deki durumu Active olmalı; yeni kayıt (Pending) ise endpoint
[AllowPendingAccount] taşımıyorsa 403 normaldir.Provisioning loglarını izleme
Provisioning loglarını izleme
Provisioning
[Provisioning] öneki ile loglar:Keycloak'a ulaşılamıyor tekrarlıyorsa KeycloakProvisioning:Admin:BaseUrl yanlış ya da
Keycloak henüz ayağa kalkmadı (120 sn’ye kadar bekler). Hata olsa bile uygulama yine başlar;
o yüzden realm yokmuş gibi davranan 401’lerde önce bu logları kontrol edin.Kapalı ağ (intranet) senaryosu
Kapalı ağ (intranet) senaryosu
Müşteri ortamı kurumsal TLS sertifikalı kapalı bir intranet olabilir (Let’s Encrypt çalışmaz).Notlar:
KEYCLOAK_BASE_URL/KEYCLOAK_EXTERNAL_URLiç DNS adını işaret etmeli.- API, kurumsal kök sertifikaya güvenmeli — gerekirse
scripts/export-ca-cert.ps1ile CA sertifikası container trust store’una eklenir. RequireHttpsMetadata: truetutulur; metadata HTTPS üzerinden alınır.- Provisioning kapalı, realm bir kez elle/tek-sefer kurulur.
Hızlı kontrol komutları
İlgili
Ortamlar
BaseUrl vs PublicBaseUrl ayrımı.
Authentication
Issuer / audience / MapInboundClaims.
Provisioning
Hosted service ve loglar.
Client Yapılandırması
Redirect URI / PKCE ayarları.