OAuth 2.0, üçüncü taraf uygulamalara kullanıcının kimlik bilgilerini paylaşmadan kaynaklarına sınırlı erişim sağlayan endüstri standardı bir yetkilendirme protokolüdür. Protokol, web ve mobil uygulamalarda yetki devri için fiili standart haline gelmiş olup Google, Facebook, Apple ve GitHub gibi platformlar tarafından kullanılmaktadır. IETF RFC 6749 (2025)'a göre, OAuth 2.0, yetki devredilmiş veri erişimi gerektiren tüm API entegrasyonlarının %85'inden fazlasında kullanılmaktadır.
Önemli Noktalar
OAuth 2.0, IETF RFC 6749'da tanımlanan, üçüncü taraf uygulamaların kullanıcının kullanıcı adını ve şifresini ifşa etmeden kaynaklarına sınırlı erişim elde etmesini sağlayan bir yetkilendirme protokolüdür. Protokol, şifre modelinin temel bir sorununu çözer: şifrenizi emanet ettiğiniz bir uygulama, tüm hesap verilerine sınırsız erişim elde eder. OAuth 2.0, açıkça sınırlandırılmış bir erişim kapsamına sahip geçici bir token yayınlayarak bu yaklaşımı değiştirir.
OAuth 2.0'ın mimarisi yetki devridir. Kullanıcı (Resource Owner), bir aracı olan yetkilendirme sunucusu (Authorization Server) aracılığıyla kaynak sunucusunda (Resource Server) depolanan verilerine erişmesi için bir uygulamayı (Client) yetkilendirir. Yetkilendirme sunucusu bir Access Token yayınlar: uygulamanın verilere erişmek için kaynak sunucusuna sunduğu kriptografik bir dize. OAuth 2.0 ile SAML veya OpenID Connect arasındaki önemli bir fark: OAuth 2.0 yetkilendirme görevini (neye izin verildiği) çözer, kimlik doğrulamayı (kullanıcının kim olduğu) değil. Kimlik doğrulama için OAuth 2.0 üzerinde OpenID Connect (OIDC) protokolü oluşturulmuştur.
Protokol tüm büyük platformlar tarafından desteklenmektedir. Google, Google API'lerine (Gmail, Drive, Calendar) erişmek için OAuth 2.0 kullanır, Facebook Graph API için, Apple Sign in with Apple (ASAuthorizationAppleIDProvider) için ve GitHub depo erişimi için kullanır. Mobil geliştirme bağlamında, OAuth 2.0 üçüncü taraf hizmetleri entegre etmek için standart mekanizmadır: sosyal ağlar üzerinden giriş, bulut depolamaya erişim ve kullanıcı adına içerik yayınlama.
OAuth 2.0 protokolü, etkileşimleri tam yetkilendirme döngüsünü oluşturan dört rol tanımlar. Mobil bir uygulamada protokolü doğru şekilde uygulamak için her rolü anlamak önemlidir.
| Rol | Açıklama | Örnek |
|---|---|---|
| Resource Owner | Veri sahibi: kaynaklarına erişime izin veren kullanıcı | “Google ile Oturum Aç” düğmesine tıklayan uygulama kullanıcısı |
| Client | Sahibi adına kaynaklara erişim talep eden uygulama | Google Drive'a erişmesi gereken mobil uygulama |
| Authorization Server | Kimlik doğrulama ve yetkilendirmeden sonra token yayınlayan sunucu | accounts.google.com: Google'ın yetkilendirme sunucusu |
| Resource Server | Token aracılığıyla korunan kaynaklara erişim sağlayan API | www.googleapis.com: Google Drive API kaynak sunucusu |
Protokolün temel varlıkları Access Token, Refresh Token ve Authorization Code'dur. Access Token, her veri talebinde kaynak sunucusuna sunulan kısa ömürlü bir tokendir (genellikle 15–60 dakika). Refresh Token, kullanıcının tekrar oturum açmasına gerek kalmadan yeni bir Access Token almak için kullanılan uzun ömürlü bir tokendir (günler veya haftalar). Authorization Code, kullanıcı yetkilendirmesinden sonra yayınlanan ve bir Access Token ve Refresh Token ile değiştirilen geçici bir koddur.
OAuth 2.0, her biri belirli bir istemci türü ve güvenlik bağlamı için tasarlanmış çeşitli Grant Types (token alma senaryoları) tanımlar. Mobil bir uygulamada yetkilendirme tasarlarken doğru Grant Type'ı seçmek kritik bir mimari karardır.
Ana Grant Types şunlardır: Authorization Code (sunucu bileşeni olan mobil ve web uygulamaları için en güvenlisi), PKCE ile Authorization Code (Proof Key for Code Exchange: sunucu arka ucu olmayan mobil ve SPA uygulamaları için), Client Credentials (kullanıcı katılımı olmadan sunucudan sunucuya kimlik doğrulama için), Resource Owner Password Credentials (kullanımdan kaldırıldı: şifreyi doğrudan iletir). PKCE, OAuth Security BCP (RFC 9700) tavsiyelerine göre genel istemciler (mobil uygulamalar, SPA'lar) için zorunlu bir uzantıdır.
PKCE ile Authorization Code Flow, yerel mobil uygulamalar için önerilen OAuth 2.0 yapılandırmasıdır. PKCE (Proof Key for Code Exchange), authorization code ele geçirme saldırılarını önleyen ek bir koruma katmanı ekler. Protokol IETF RFC 7636'da açıklanmıştır.
Adımların sıralaması: (1) istemci rastgele bir code_verifier oluşturur (yalnızca ayrılmamış karakterleri kullanan 43–128 karakterlik bir dize), (2) istemci code_challenge = SHA-256(code_verifier) hesaplar, (3) istemci, code_challenge'ı ileterek Authorization Server'da kullanıcı yetkilendirmesi için bir tarayıcı açar, (4) başarılı yetkilendirmeden sonra sunucu, özel bir URI şeması (uygulama derin bağlantısı) aracılığıyla authorization code'u uygulamaya döndürür, (5) istemci, authorization code + code_verifier'ı sunucuya gönderir, (6) sunucu SHA-256(code_verifier) === code_challenge'ı doğrular ve bir Access Token + Refresh Token yayınlar.
PKCE'nin avantajı: bir saldırgan URI şemasında authorization code'u ele geçirse bile, yalnızca meşru istemcinin bildiği code_verifier olmadan bunu bir token ile değiştiremez. Mobil uygulamalarda, tarayıcıyı açmak için Chrome Custom Tabs (Android) veya ASWebAuthenticationSession (iOS) kullanılmalıdır; bu, sistem tarayıcısının uygulamanın belleğinden code_verifier'a erişememesini sağlar.
AppAuth, IETF tarafından önerilen, yerel uygulamalar için OAuth 2.0 ve OpenID Connect'in referans uygulamasıdır. Kütüphane PKCE, Chrome Custom Tabs, authorization code'u döndürmek için özel URI şemaları ve otomatik token yenilemeyi destekler. Android için AppAuth, `net.openid:appauth:0.11.1` bağımlılığı ile kullanılabilir.
val serviceConfig = AuthorizationServiceConfiguration.fromUrl(
Uri.parse("https://accounts.google.com/.well-known/openid-configuration")
)
val request = AuthorizationRequest.Builder(
serviceConfig,
"CLIENT_ID.apps.googleusercontent.com",
ResponseTypeValues.CODE,
Uri.parse("com.example.app:/oauth2callback")
)
.setScope("openid profile email")
.setCodeVerifier(
CodeVerifierUtil.generateRandomCodeVerifier()
)
.build()
val authService = AuthorizationService(context)
val intent = authService.getAuthorizationRequestIntent(request)
// Yetkilendirme için Chrome Custom Tab başlatma
startActivityForResult(intent, REQUEST_CODE_AUTH)
authorization code'u (onActivityResult) aldıktan sonra, uygulama bunu bir TokenRequest aracılığıyla Access Token ve Refresh Token ile değiştirir. Token'lar, EncryptedSharedPreferences (Android Security Crypto) aracılığıyla şifreleme ile SharedPreferences'te saklanır. Refresh Token, KeyStore'da (diğer uygulamaların erişemeyeceği donanım tabanlı bir anahtar deposu) saklanmalıdır. Access Token'ın süresi her dolduğunda, uygulama yenisini almak için Refresh Token'ı kullanır: kullanıcının yeniden kimlik doğrulaması yapması gerekmez.
// authorization code'u token'larla değiştirme
val data = intent?.data ?: return
val resp = AuthorizationResponse.fromIntent(data)
val exchangeReq = resp?.createTokenExchangeRequest()
?: return
authService.performTokenRequest(
exchangeReq,
ClientAuthentication.none()
) { tokenResp, ex ->
if (tokenResp != null) {
// Access Token ve Refresh Token alındı
val accessToken = tokenResp.accessToken
val refreshToken = tokenResp.refreshToken
// EncryptedSharedPreferences'e kaydet
saveTokens(accessToken, refreshToken)
}
}
Yukarıdaki kod, PKCE ile tam OAuth 2.0 akışını göstermektedir: OpenID Connect Discovery aracılığıyla sunucu yapılandırması oluşturma, code_verifier ile yetkilendirme talebi oluşturma, Chrome Custom Tab başlatma, özel URI şeması aracılığıyla authorization code alma ve Token Request aracılığıyla kodun token'larla değiştirilmesi. Access Token süre sonunu işlemek önemlidir: Resource Server'dan HTTP 401 yanıtı alındığında, uygulama yeni bir Access Token almak için Refresh Token'ı kullanmalı ve talebi yeniden yürütmelidir.
OAuth 2.0, birçok saldırı vektörüne sahip karmaşık bir protokoldür. IETF Security BCP (RFC 9700), OAuth 2.0 güvenlik açıklarının 20'den fazla sınıfını tanımlar. Mobil uygulamalar için en kritik olanlar: özel URI şemaları aracılığıyla authorization code ele geçirme, geri arama uç noktalarına CSRF saldırıları, güvenli olmayan depolamadan Refresh Token hırsızlığı ve intent ele geçirme yoluyla istemci kimliğine bürünmedir.
Bu saldırılara karşı koruma zorunlu önlemleri içerir: (1) S256 code_challenge ile PKCE: URI şeması ele geçirilse bile authorization code ele geçirmeyi önler; (2) CSRF'yi önlemek için nonce veya state parametresi kullanımı: sunucu, authorization code'un orijinal taleple eşleştiğini doğrular; (3) Refresh Token'ı yalnızca KeyStore'da (Android) veya Keychain'de (iOS) saklama: asla SharedPreferences veya UserDefaults'ta değil; (4) taşıma katmanında MITM'ye karşı koruma için Certificate Pinning ile TLS kullanımı; (5) redirect_uri doğrulaması: yetkilendirme sunucusu, kayıtlı URI ile eşleşmeyi sıkı bir şekilde doğrulamalıdır.
IETF'den ek tavsiyeler: mobil uygulamalar güvenlik denetimlerinden geçmiş AppAuth veya benzer kütüphaneleri kullanmalıdır; OAuth için WebView'a güvenmeyin (WebView, verileri ana uygulamadan ayırmaz); otomatik Refresh Token döndürme uygulayın (her Refresh Token yalnızca bir kez kullanılabilir); Android için TrustManager ve iOS için URLSession aracılığıyla Certificate Pinning ekleyin. OpenID Connect Discovery (well-known uç noktası), yetkilendirme sunucusunun doğru uç noktalarını otomatik olarak belirlemeye ve kimlik avı sayfalarına yönlendirmelerden kaçınmaya yardımcı olur.
Sıkça Sorulan Sorular
OAuth 2.0 bir yetkilendirme protokolüdür (ne yapılmasına izin verilir?), OpenID Connect (OIDC) ise bir kimlik doğrulama protokolüdür (kullanıcı kimdir?). OIDC, OAuth 2.0 üzerine inşa edilir ve bir ID Token (kullanıcının kimliği hakkında bilgi içeren bir JWT tokeni) ekler. OAuth 2.0 bir Access Token sağlar, OIDC bunu bir ID Token ve kullanıcı profili almak için bir UserInfo uç noktası ile tamamlar.
Bearer Token, HTTP Authorization: Bearer başlığında sunulan bir Access Token'dır. Tehlikesi, token'a sahip olan herkesin kaynağa erişebilmesidir: token istemciye bağlı değildir. Bu nedenle, Bearer Token yalnızca TLS (HTTPS) üzerinden iletilmeli, kısa bir ömre (15–60 dakika) sahip olmalı ve asla günlüklerde veya URL parametrelerinde saklanmamalıdır.
Mobil uygulamalar, client_secret'i olmayan genel istemcilerdir (bir sır APK/IPA içinde korunamaz). PKCE olmadan, bir saldırgan özel bir URI şeması (örneğin, malformed://callback?code=ABC) aracılığıyla authorization code'u ele geçirebilir ve bunu bir token ile değiştirebilir. PKCE, yalnızca uygulama tarafından bilinen bir code_verifier ekleyerek ele geçirilen kodu kullanışsız hale getirir.
Tipik bir Access Token 15–60 dakika yaşar (yetkilendirme sunucusunda yapılandırılabilir). Resource Server'a yapılan her HTTP talebinde yanıt kontrol edilir: kod 401 ise, uygulama yeni bir Access Token almak için Refresh Token Flow'u tetikler. Refresh Token, sağlayıcının güvenlik politikasına bağlı olarak 24 saatten birkaç aya kadar yaşar. Refresh Token değiştiğinde, eskisi geçersiz kılınır.
Hayır: IETF Security BCP (RFC 9700), mobil uygulamalarda OAuth 2.0 için WebView'ı yasaklar. WebView, çerezleri ve verileri ana uygulamadan ayırmaz ve uygulamanın kullanıcının kimlik bilgilerini ele geçirmesine olanak tanır. WebView yerine, Chrome Custom Tabs (Android) veya ASWebAuthenticationSession (iOS) kullanın: uygulamadan izole edilmiş sistem tarayıcı bileşenleri.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun