Bir uygulamanın kullanıcı parolasını hiç görmeden Google Drive dosyalarına erişebilmesi nasıl mümkün olur? OAuth 2.0, tam da bu problemi çözen bir yetkilendirme çerçevesidir. Kullanıcı, bir uygulamaya belirli ve sınırlı izinler verir; uygulama ise bu izinleri temsil eden token’larla API çağrıları yapar. Böylece parola paylaşımı yerine kontrollü, süreli ve gerektiğinde geri alınabilir erişim sağlanır.
``
Önce önemli bir ayrımı netleştirelim: OAuth 2.0 tek başına bir kimlik doğrulama (authentication) protokolü değildir. Yani teorik olarak “Bu kullanıcı gerçekten Ayşe mi?” sorusunu çözmekten çok, “Bu uygulama Ayşe adına hangi kaynağa ne kadar süreyle erişebilir?” sorusuna odaklanır. Kullanıcı bilgilerini standart biçimde almak için OAuth 2.0 üzerine kurulu OpenID Connect (OIDC) tercih edilir.
| Kavram | Sorduğu soru | Örnek |
|---|---|---|
| Authentication | Sen kimsin? | Kullanıcının Google hesabıyla oturum açması |
| Authorization | Ne yapabilirsin? | Uygulamanın takvimi okuyabilmesi |
| OAuth 2.0 | İzni nasıl devrederiz? | Uygulamaya sınırlı erişim token’ı verme |
| OpenID Connect | Kimlik bilgisini nasıl taşırız? | id_token ile kullanıcı kimliği alma |
OAuth evreninde dört temel oyuncu vardır: Resource Owner kullanıcıdır; Client erişim isteyen uygulamadır; Authorization Server kullanıcının iznini alıp token üretir; Resource Server ise korunmuş API’yi barındırır. Örneğin bir takvim uygulamasında kullanıcı kaynak sahibidir, mobil uygulama client’tır, Google yetkilendirme sunucusudur ve Google Calendar API kaynak sunucusudur.
En güvenli ve güncel tarayıcı/mobil senaryolarında kullanılan yöntem Authorization Code Flow with PKCE akışıdır. Adımlar şöyledir:
- Uygulama rastgele bir
state,code_verifierve bunun özetinden oluşancode_challengeüretir. - Kullanıcı, yetkilendirme sunucusunun giriş ve izin ekranına yönlendirilir.
- Kullanıcı istenen kapsamları (
scope) onaylar. - Sunucu uygulamanın geri dönüş adresine kısa ömürlü bir
authorization_codegönderir. - Uygulama bu kodu,
code_verifierile birlikte token uç noktasına iletir. - Sunucu doğrulama sonrası
access_token, gerekirserefresh_tokenve OIDC kullanılıyorsaid_tokendöner.
PKCE’nin mantığı basit ama güçlüdür. Saldırgan yönlendirme sırasında authorization code’u ele geçirse bile gizli doğrulayıcıyı bilmeden token alamaz. Özet ilişkiyi şöyle düşünebiliriz:
\[code\_challenge = BASE64URL(SHA256(code\_verifier))\]state parametresi ise CSRF saldırılarına karşı istemci tarafından üretilen ve dönüşte doğrulanan bir bağlam değeridir. Bu iki parametre “küçük ayrıntı” değil, akışın güvenlik kemeridir.
Aşağıdaki örnek, kullanıcıyı yetkilendirme ekranına göndermek için JavaScript ile URL üretir:
const params = new URLSearchParams({
response_type: "code",
client_id: "calendar-web-client",
redirect_uri: "https://app.example.com/callback",
scope: "openid profile calendar.readonly",
state: crypto.randomUUID(),
code_challenge: generatedChallenge,
code_challenge_method: "S256"
});
window.location.href = `https://auth.example.com/authorize?${params}`;
Bu kodun görevi token almak değil, kullanıcıyı güvenilir yetkilendirme sunucusuna yönlendirmektir. Dönüşte gelen code, tarayıcıda uzun süre saklanmamalı; mümkünse sunucu tarafında token ile değiştirilmelidir.
Token’ların ömrü ve kapsamı güvenlik dengesini belirler. Risk kabaca token gücü, kapsamı ve geçerlilik süresiyle artar: $Risk \propto Scope \times Lifetime$. Bu nedenle calendar.readonly gibi en dar kapsamları istemek, saatlerce yaşayan access token’lar yerine kısa ömürlü token kullanmak gerekir.
| Token türü | Amaç | Güvenlik notu |
|---|---|---|
| Access Token | API çağrısı yapmak | Kısa ömürlü tutulmalıdır |
| Refresh Token | Yeni access token almak | Çok dikkatli saklanmalıdır |
| ID Token | Kullanıcı kimliği bilgisini taşımak | API erişimi için kullanılmamalıdır |
Son olarak, redirect_uri değerini tam eşleşmeyle doğrulayın, token’ları URL sorgu parametrelerine koymayın, HTTPS zorunlu kullanın ve erişim token’ını JWT diye körü körüne güvenilir kabul etmeyin. OAuth 2.0 doğru kurulduğunda kullanıcı deneyimini kolaylaştırır; yanlış kurulduğunda ise anahtarı kapının üzerinde bırakmaya benzer.
Yorumlar