BuildingBlocks.OAuth paketi, harici kimlik sağlayıcılarla (Google, Meta, Keycloak) authorization-code + PKCE akışını tek bir provider-agnostik kontrat üzerinden yürütmek için gereken soyutlama ve modelleri barındırır. Somut HTTP istemcileri (KeycloakOAuthClient, GoogleIdentityOAuthClient, MetaIntegrationOAuthClient vb.) DiyanetCleanArchitecture.Infrastructure.Services.OAuth projesinde bu kontratı implement eder.
Provider implementasyonları, DI kaydı (
AddOAuthProviders) ve uçtan uca giriş akışı Altyapı Servisleri / OAuth sayfasında anlatılır. Bu sayfa paketteki arayüz ve modellere odaklanır.IOAuthClient<TUserInfo>
Tüm provider’lar bu generic kontratı uygular. TUserInfo, sağlayıcıya özgü kullanıcı profili tipidir (örn. GoogleUserInfoDto).
| Metot | İmza | Amaç |
|---|---|---|
CreateAuthorizationRequestAsync | Task<AuthorizationRequest> CreateAuthorizationRequestAsync(string state) | Authorize URL + PKCE challenge üretir; state client context/returnUrl taşır |
ExchangeCodeAsync | Task<OAuthTokenResponse> ExchangeCodeAsync(string code, string codeVerifier) | Callback’teki code’u token’a çevirir (PKCE verifier ile) |
GetUserInfoAsync | Task<TUserInfo> GetUserInfoAsync(string accessToken) | Access token ile provider’dan kullanıcı profilini çeker |
Keycloak istemcisi (
KeycloakOAuthClient) PKCE verifier’ı Redis’te tuttuğu için imzası biraz farklıdır — ExchangeCodeAsync(code, state) alır ve verifier’ı cache’ten kendisi çözer. Bkz. PKCE’nin saklanması.Modeller
| Tip | Üyeler | Açıklama |
|---|---|---|
AuthorizationRequest | Url, CodeVerifier, CodeChallenge, State (hepsi init) | Authorize akışını başlatmak için gereken bilgi paketi |
OAuthTokenResponse | AccessToken, TokenType, ExpiresIn, RefreshToken, RefreshExpiresIn, Scope, IdToken, IdTokenType | Token endpoint’inin snake_case JSON yanıtı ([JsonPropertyName] ile maplenir) |
OAuthUserInfo | Sub, FirstName, LastName, DisplayName, Roles, Uid | Provider-bağımsız temel kullanıcı bilgisi |
OAuthContextType | Identity, Integration (enum) | Akış tipi ayrımı — aşağıya bakın |
PKCE — PkcePair
PkcePair ctor’unda otomatik üretilir. code_verifier 64 byte rastgele veridir; code_challenge ise verifier’ın SHA-256 özetinin Base64URL kodudur (S256 metodu).
| Üye | Tip | Üretim |
|---|---|---|
CodeVerifier | string | RandomNumberGenerator.GetBytes(64) → Base64URL |
CodeChallenge | string | SHA256(verifier) → Base64URL (= kırpılır, +→-, /→_) |
PKCE’nin Redis’te saklanması
code_verifier, authorize ile callback istekleri arasında saklanmalıdır (iki ayrı HTTP isteği). Keycloak istemcisi bunu IDistributedCache (Redis) üzerinde state key’iyle tutar:
- Anahtar:
keycloak_pkce_{state} - TTL: 10 dakika (
StateExpiry) - Callback’te alınır ve tek kullanımlık olarak hemen silinir (
RemoveAsync)
Konfigürasyon — OAuthOptions
OAuth bölümüne bind edilir. Google ve Meta için iki ayrı flow (Identity ve Integration) tanımlanır; her flow kendi client kimliği ve endpoint’lerine sahiptir.
| Tip | Üyeler |
|---|---|
OAuthOptions | OAuthProviderOptions Google, OAuthProviderOptions Meta |
OAuthProviderOptions | OAuthFlowOptions Identity, OAuthFlowOptions Integration |
OAuthFlowOptions | ClientId, ClientSecret, AuthorizationEndpoint, TokenEndpoint, RedirectUri, Issuer, OpenIDConnectDiscoveryEndpoint, UserInfoEndpoint, Scopes |
Keycloak
OAuthOptions’tan çıkarılmıştır. Keycloak tek config bloğu olarak Keycloak section’ından okunur (BuildingBlocks.Keycloak.KeycloakOptions veya OAuth projesindeki KeycloakOptions). Endpoint URL’leri BaseUrl + Realm’dan otomatik hesaplanır ({BaseUrl}/realms/{Realm}/protocol/openid-connect/auth vb.), config’e yazılmaz.Identity vs Integration
OAuthContextType iki kullanım senaryosunu ayırır:
- Identity — kullanıcı bu provider ile giriş yapar (login/connect). Token uygulamaya kimlik kanıtlar.
- Integration — kullanıcı zaten girişlidir; uygulama provider API’sine erişim için ek yetki alır (ör. Meta sayfa yönetimi). Farklı client/secret ve scope kullanır.
Kullanım — authorize → callback → exchange → userinfo
İlgili
OAuth servisleri
Google/Meta/Keycloak istemcileri, AddOAuthProviders ve uçtan uca akış.
Keycloak
Çift realm JWT doğrulama ve claims transformation.
JWT
Exchange sonrası uygulama token’ının üretimi.
Cache
PKCE verifier’ının Redis’te saklanması.