Google, Meta ve Keycloak OAuth2 entegrasyonu — BuildingBlocks.OAuth soyutlaması, PKCE (S256) ve backend-driven akış.
OAuth servisi 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.
Integration istemcisi — geniş kapsamlı entegrasyon izinleri (örn. Google Business, Meta sayfaları/Instagram/WhatsApp): IGoogleIntegrationOAuthClient, IMetaIntegrationOAuthClient.
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):
public class PkcePair{ public string CodeVerifier { get; } public string CodeChallenge { get; } public PkcePair() { CodeVerifier = Base64UrlEncode(RandomNumberGenerator.GetBytes(64)); CodeChallenge = Base64UrlEncode(SHA256.HashData(Encoding.ASCII.GetBytes(CodeVerifier))); }}
GoogleIdentityOAuthClient, authorize/exchange/userinfo akışını implemente eder. Ayrıca id_token doğrulayan ayrı bir bileşen vardır — GoogleIdTokenVerifier (Google.Apis.Auth):
public async Task<GoogleTokenPayload> VerifyAsync(string idToken){ var settings = new GoogleJsonWebSignature.ValidationSettings { Audience = new[] { _options.Google.Identity.ClientId } }; var payload = await GoogleJsonWebSignature.ValidateAsync(idToken, settings); // ... Subject, Email, EmailVerified, Name, GivenName, FamilyName, Picture, Locale}
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.
Ç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 dakikaIMemoryCache’te tutulur:
JwtSecurityTokenHandlerMapInboundClaims = 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).