src/DiyanetCleanArchitecture.Infrastructure.Services.OAuth projesindedir ve üç sağlayıcıyı destekler: Google, Meta ve Keycloak. Ortak soyutlama BuildingBlocks.OAuth paketinde tanımlıdır.
Soyutlama — IOAuthClient<TUserInfo>
- Identity istemcisi — kullanıcı kimliği (login):
IGoogleIdentityOAuthClient,IMetaIdentityOAuthClient. - Integration istemcisi — geniş kapsamlı entegrasyon izinleri (örn. Google Business, Meta sayfaları/Instagram/WhatsApp):
IGoogleIntegrationOAuthClient,IMetaIntegrationOAuthClient.
PKCE — PkcePair (S256)
Tüm akışlar PKCE kullanır. PkcePair 64 byte rastgele code_verifier üretir ve SHA-256 ile code_challenge türetir (code_challenge_method=S256):
Akış (backend-driven)
1
Authorize
CreateAuthorizationRequestAsync(state) → PKCE üretir, sağlayıcının authorize URL’ini (client_id, redirect_uri, response_type=code, scope, code_challenge, state) kurar.2
Code
Kullanıcı sağlayıcıda giriş yapar, callback URL’e
code + state ile döner.3
Exchange
ExchangeCodeAsync(code, codeVerifier) → token endpoint’ine grant_type=authorization_code ile POST atar, OAuthTokenResponse alır.4
UserInfo
GetUserInfoAsync(accessToken) → userinfo endpoint’inden profil çeker.GoogleIdentityOAuthClient, authorize/exchange/userinfo akışını implemente eder. Ayrıca id_token doğrulayan ayrı bir bileşen vardır — GoogleIdTokenVerifier (Google.Apis.Auth):
Meta
MetaIdentityOAuthClient ve MetaIntegrationOAuthClient, Facebook v19.0 OAuth dialog ve Graph API endpoint’lerini kullanır. Integration scope’ları sayfa yönetimi, Instagram ve WhatsApp Business izinlerini içerir.
Keycloak
Keycloak istemcisi (KeycloakOAuthClient) diğerlerinden farklı olarak code_verifier’ı Redis’te saklar (IDistributedCache). Anahtar keycloak_pkce_{state}, TTL 10 dakika, tek kullanımlık (exchange’de okunup silinir):
Token doğrulama — KeycloakTokenValidator
Çift realm (Vatandaş + Personel) desteklenir. Validator, token’ı önce imza doğrulamadan okuyup iss claim’inden realm’i tespit eder, sonra ilgili realm’in JWKS endpoint’inden public key çekerek imzayı doğrular. JWKS 60 dakika IMemoryCache’te tutulur:
JwtSecurityTokenHandler MapInboundClaims = false ile kurulur — böylece claim’ler sub, email, name gibi orijinal OIDC isimleriyle gelir. Aksi halde Microsoft.IdentityModel bunları uzun ClaimTypes.* URL’lerine çevirir ve sub/email lookup’ları boş döner.SecurityTokenSignatureKeyNotFoundException alınırsa JWKS bir kez forceRefresh: true ile yeniden çekilir (key rotation senaryosu).
Config — OAuth ve Keycloak
Google/Meta OAuth kök bölümünden, Keycloak ise Keycloak kök bölümünden bind edilir.
DI kaydı — AddOAuthProviders
Keycloak Kurulumu
Çift realm yapılandırması ve provisioning.
Auth Mimarisi
Login akışları, JWT ve RBAC entegrasyonu.