Skip to content
~/sph.sh

Mobil, Web ve API için Kimlik Doğrulama Sağlayıcıları: Doğru Çözümü Seçmek için Eksiksiz Kılavuz

Auth0, Firebase Auth, Supabase Auth, AWS Cognito ve özel çözümlerin gerçek dünya karşılaştırması. Her birini ne zaman kullanmalı, maliyet analizi ve bana her şeyi öğreten hata ayıklama kabusları.

Özet

Kimlik doğrulama sağlayıcısı seçimi, geliştirme hızını, güvenlik duruşunu ve operasyonel maliyetleri önemli ölçüde etkiler. Bu analiz, beş kimlik doğrulama yaklaşımını sistematik bir çerçeve aracılığıyla inceleyerek, çeşitli organizasyonel bağlamlarda üretim dağıtımlarına dayalı nicel maliyet karşılaştırmaları, teknik tavizler ve uygulama rehberliği sağlar.

Bağlam ve Problem Alanı

Bir projede parçalanmış bir kimlik doğrulama manzarası devraldım: web uygulamaları için Auth0, mobil istemciler için Firebase Auth, API'ler için özel JWT ve üç ayrı kullanıcı veritabanı. Kullanıcılar web üzerinden kayıt olduğunda ancak mobil üzerinden hesaplarına erişemediğinde ("kullanıcı bulunamadı" hataları), konsolidasyon zorunluluğu netleşti.

Modern uygulamalar, güvenlik, kullanıcı deneyimi, geliştirme karmaşıklığı ve maliyet verimliliğini dengeleyen kimlik doğrulama çözümleri gerektirir. Kimlik doğrulama sağlayıcılarının çoğalması, "en iyi" seçimin büyük ölçüde organizasyonel bağlam, teknik kısıtlamalar ve büyüme yörüngesine bağlı olduğu karmaşık bir karar matrisi oluşturmuştur.

Analiz Çerçevesi

Bu değerlendirme, altı kritik boyut boyunca yapılandırılmış bir karar çerçevesi kullanır:

1. Maliyet Yapısı Analizi

  • Sabit Maliyetler: Temel abonelik ücretleri ve kurulum giderleri
  • Değişken Maliyetler: Kullanıcı başına, kimlik doğrulama başına veya kullanım tabanlı fiyatlandırma
  • Gizli Maliyetler: Geliştirme süresi, bakım yükü, göç giderleri
  • Ölçek Ekonomisi: 10K, 50K ve 100K+ kullanıcıda maliyet davranışı

2. Teknik Entegrasyon Değerlendirmesi

  • Kurulum Karmaşıklığı: Üretime hazır uygulama süresi
  • Platform Desteği: Web, mobil (iOS/Android), API uyumluluğu
  • Özelleştirme Derinliği: Kimlik doğrulama akışı modifikasyon yetenekleri
  • Satıcı Kilitlenmesi Riski: Göç zorluğu ve veri taşınabilirliği

3. Kurumsal Hazırlık

  • Uyumluluk Kapsamı: SOC 2, GDPR, HIPAA, sektöre özgü gereksinimler
  • Kurumsal Özellikler: SAML/SSO, çok kiracılık, denetim kayıtları
  • Güvenlik Duruşu: MFA seçenekleri, tehdit algılama, güvenlik sertifikaları
  • Destek Kalitesi: Dokümantasyon, topluluk, kurumsal destek katmanları

4. Operasyonel Özellikler

  • Güvenilirlik Metrikleri: SLA taahhütleri, geçmiş çalışma süresi
  • Performans Etkisi: Gecikme, verim, önbellekleme yetenekleri
  • İzleme Entegrasyonu: Gözlemlenebilirlik, hata ayıklama araçları
  • Bakım Yükü: Güncellemeler, güvenlik yamaları, operasyonel yük

5. Geliştirici Deneyimi

  • API Kalitesi: SDK tamlığı, dokümantasyon netliği
  • Öğrenme Eğrisi: Geliştirme ekipleri için katılım süresi
  • Hata Ayıklama Araçları: Hata işleme, günlükleme, geliştirme ortamları
  • Topluluk Ekosistemi: Üçüncü taraf entegrasyonlar, topluluk desteği

6. Stratejik Uyum

  • Teknoloji Yığını Uyumluluğu: Ekosistem entegrasyon faydaları
  • Organizasyonel Yetenek: Gerekli uzmanlık ve ekip becerileri
  • Büyüme Yörüngesi: Ölçekleme özellikleri ve gelecek gereksinimler
  • Risk Toleransı: Satıcı bağımlılığı, teknik borç etkileri

Sağlayıcı Analizi

Bu çerçeveyi beş kimlik doğrulama yaklaşımına uygulamak, farklı güç profilleri ve optimal kullanım durumları ortaya çıkarır:

Auth0: Kurumsal İş Atı

Ne zaman kullanırım: Kurumsal uygulamalar, B2B SaaS, uyumluluk ağırlıklı endüstriler Ne zaman kaçınırım: Sıkı bütçeli startup'lar, basit tüketici uygulamaları

Gerçek üretim deneyimi:

typescript
// Üretimde gerçekten çalışan Auth0 yapılandırmasıconst auth0Config = {  domain: process.env.AUTH0_DOMAIN,  clientId: process.env.AUTH0_CLIENT_ID,  audience: process.env.AUTH0_AUDIENCE,  // Kritik: API erişimi için uygun scope'ları ayarlayın  scope: 'openid profile email read:users write:users',  // Rate limit'lerden kaçınmak için token'ları düzgün önbelleğe alın  cacheLocation: 'localstorage',  useRefreshTokens: true,  // Token süresinin dolmasını zarif bir şekilde ele alın  onRedirectCallback: (appState) => {    window.history.replaceState(      {},      document.title,      appState?.returnTo || window.location.pathname    );  }};

İyi yanları:

  • SOC 2, GDPR, HIPAA uyumluluğu hazır
  • Mükemmel kurumsal özellikler (SAML, LDAP, MFA)
  • Kullanıcı yönetimi için sağlam admin paneli
  • Harika dokümantasyon ve destek

Kötü yanları:

  • Maliyet: 7.000 kullanıcı için 23/ay,sonrakullanıcıbas\cına0,00325/ay, sonra kullanıcı başına 0,00325. 100k kullanıcıda, bu 300$/ay'dan fazla
  • Karmaşıklık: Basit uygulamalar için aşırı
  • Satıcı kilitlenmesi: Özel kurallar ve hook'lar sizi Auth0'a bağlar
  • Performans: Yüksek trafikli senaryolarda bazen yavaş token doğrulama

Gerçek hata ayıklama hikayesi: Auth0'ın yoğun saatlerde token'ları doğrulamak için 2+ saniye sürdüğü bir üretim sorunumuz vardı. Token'ları düzgün önbelleğe almadığımız için rate limit'lere çarptığımız ortaya çıktı. Çözüm Redis tabanlı token önbellekleme uygulamaktı, ancak bu yığınımıza başka bir bağımlılık ekledi.

Firebase Auth: Google Ekosistem Seçimi

Ne zaman kullanırım: Mobil öncelikli uygulamalar, Google ekosistem entegrasyonu, hızlı prototipleme Ne zaman kaçınırım: Çok kiracılı B2B uygulamaları, katı uyumluluk gereksinimleri

Üretim yapılandırması:

typescript
// React Native + Web için Firebase Auth kurulumuimport { initializeApp } from 'firebase/app';import { getAuth, connectAuthEmulator } from 'firebase/auth';
const firebaseConfig = {  apiKey: process.env.FIREBASE_API_KEY,  authDomain: process.env.FIREBASE_AUTH_DOMAIN,  projectId: process.env.FIREBASE_PROJECT_ID,  // Kritik: Bunları istemci tarafı kodda açığa çıkarmayın  storageBucket: process.env.FIREBASE_STORAGE_BUCKET,  messagingSenderId: process.env.FIREBASE_MESSAGING_SENDER_ID,  appId: process.env.FIREBASE_APP_ID};
const app = initializeApp(firebaseConfig);const auth = getAuth(app);
// Üretime hazır hata işlemeauth.onAuthStateChanged((user) => {  if (user) {    // Token'ı her zaman sunucu tarafında doğrulayın    user.getIdToken(true).then((token) => {      // Doğrulama için backend'inize gönderin      verifyTokenOnServer(token);    });  }});

İyi yanları:

  • Ücretsiz katman: Ayda 10.000 kimlik doğrulama ücretsiz
  • Mobil entegrasyonu: Mükemmel React Native desteği
  • Google hizmetleri: Firestore, Functions ile sorunsuz entegrasyon
  • Basit kurulum: 30 dakikada auth'u çalıştırabilirsiniz

Kötü yanları:

  • Google kilitlenmesi: Google ekosisteminden göç etmek zor
  • Sınırlı özelleştirme: Auth akışlarını Auth0 kadar özelleştiremezsiniz
  • Admin sınırlamaları: Auth0'a kıyasla temel admin paneli
  • Uyumluluk: Sınırlı kurumsal uyumluluk özellikleri

Gerçek maliyet analizi: 50k aylık aktif kullanıcısı olan bir mobil uygulama için, Firebase Auth 0maliyetindeykenAuth0ayda150 maliyetindeyken Auth0 ayda 150. Ancak Firestore kullanımını ve diğer Google hizmetlerini hesaba kattığınızda, toplam maliyet farkı önemli ölçüde azalır.

Supabase Auth: Açık Kaynak Alternatifi

Ne zaman kullanırım: Açık kaynak projeler, PostgreSQL ağırlıklı yığınlar, maliyet bilinçli startup'lar Ne zaman kaçınırım: Kurumsal uyumluluk gereksinimleri, karmaşık çok kiracılı senaryolar

Üretim kurulumu:

typescript
// Uygun hata işleme ile Supabase Authimport { createClient } from '@supabase/supabase-js';
const supabase = createClient(  process.env.SUPABASE_URL!,  process.env.SUPABASE_ANON_KEY!);
// Üretime hazır auth hook'larıexport const useAuth = () => {  const [user, setUser] = useState(null);  const [loading, setLoading] = useState(true);
  useEffect(() => {    // İlk oturumu al    supabase.auth.getSession().then(({ data: { session } }) => {      setUser(session?.user ?? null);      setLoading(false);    });
    // Auth değişikliklerini dinle    const { data: { subscription } } = supabase.auth.onAuthStateChange(      async (event, session) => {        setUser(session?.user ?? null);        setLoading(false);      }    );
    return () => subscription.unsubscribe();  }, []);
  return { user, loading };};

İyi yanları:

  • Maliyet: Sınırsız kullanıcı için 25$/ay (kullanım limitleriyle)
  • Açık kaynak: Gerekirse kendi sunucunuzda barındırabilirsiniz
  • PostgreSQL: Özel sorgular için doğrudan veritabanı erişimi
  • Gerçek zamanlı: Yerleşik gerçek zamanlı abonelikler

Kötü yanları:

  • Olgunluk: Auth0/Firebase'den daha az olgun
  • Kurumsal özellikler: Sınırlı kurumsal uyumluluk özellikleri
  • Destek: Kurumsal destek yerine topluluk desteği
  • Karmaşıklık: Gelişmiş özellikler için daha fazla kurulum gerektirir

Gerçek uygulama hikayesi: Bir startup projesi için Supabase kullandık ve ücretsiz katman limitlerini hızla aştık. Ücretli katmana geçiş sorunsuzdı, ancak ihtiyacımız olan bazı gelişmiş özelliklerin (özel claim'ler gibi) beklenenden daha fazla çalışma gerektirdiğini keşfettik.

AWS Cognito: AWS Native Çözümü

Ne zaman kullanırım: AWS ağırlıklı mimariler, serverless uygulamalar, maliyet optimizasyonu Ne zaman kaçınırım: AWS dışı ortamlar, hızlı prototipleme

Üretim yapılandırması:

typescript
// CDK ile AWS Cognitoimport { UserPool, UserPoolClient, AccountRecovery } from 'aws-cdk-lib/aws-cognito';import { Duration } from 'aws-cdk-lib';
const userPool = new UserPool(this, 'MyUserPool', {  userPoolName: 'my-app-users',  selfSignUpEnabled: true,  signInAliases: {    email: true,    phone: true,  },  standardAttributes: {    email: {      required: true,      mutable: true,    },  },  passwordPolicy: {    minLength: 8,    requireLowercase: true,    requireUppercase: true,    requireDigits: true,    requireSymbols: true,  },  accountRecovery: AccountRecovery.EMAIL_ONLY,  // Üretim için kritik: MFA'yı etkinleştir  mfa: Mfa.REQUIRED,  mfaSecondFactor: {    sms: true,    otp: true,  },  // Token yapılandırması  accessTokenValidity: Duration.hours(1),  idTokenValidity: Duration.hours(1),  refreshTokenValidity: Duration.days(30),});

İyi yanları:

  • Maliyet: Yüksek hacimli uygulamalar için çok ucuz
  • AWS entegrasyonu: Lambda, API Gateway vb. ile sorunsuz
  • Ölçeklenebilirlik: Milyonlarca kullanıcıyı yönetir
  • Güvenlik: AWS düzeyinde güvenlik ve uyumluluk

Kötü yanları:

  • Karmaşıklık: Dik öğrenme eğrisi
  • AWS kilitlenmesi: AWS ekosistemi dışında kullanmak zor
  • UI: Temel barındırılan UI, özel geliştirme gerektirir
  • Hata ayıklama: AWS CloudWatch logları bunaltıcı olabilir

Gerçek maliyet karşılaştırması: 100k kullanıcı için, Cognito ~50/aymaliyetindeykenAuth0300/ay maliyetindeyken Auth0 300/ay'dan fazla. Ancak geliştirme süresi ve AWS uzmanlık gereksinimleri bu tasarrufları dengeleyebilir.

Özel JWT Çözümü: Tam Kontrol Seçeneği

Ne zaman kullanırım: Basit uygulamalar, öğrenme projeleri, tam kontrole ihtiyacınız olduğunda Ne zaman kaçınırım: Üretim uygulamaları, uyumluluk gereksinimleri, takım projeleri

Üretim uygulaması:

typescript
// Uygun güvenlikle özel JWT authimport jwt from 'jsonwebtoken';import bcrypt from 'bcrypt';import { randomBytes } from 'crypto';
class CustomAuthService {  private readonly JWT_SECRET = process.env.JWT_SECRET!;  private readonly JWT_EXPIRES_IN = '1h';  private readonly REFRESH_TOKEN_EXPIRES_IN = '7d';
  async generateTokens(userId: string, email: string) {    const accessToken = jwt.sign(      { userId, email, type: 'access' },      this.JWT_SECRET,      { expiresIn: this.JWT_EXPIRES_IN }    );
    const refreshToken = jwt.sign(      { userId, type: 'refresh' },      this.JWT_SECRET,      { expiresIn: this.REFRESH_TOKEN_EXPIRES_IN }    );
    // Refresh token hash'ini veritabanında sakla    const refreshTokenHash = await bcrypt.hash(refreshToken, 12);    await this.storeRefreshToken(userId, refreshTokenHash);
    return { accessToken, refreshToken };  }
  async verifyToken(token: string) {    try {      const decoded = jwt.verify(token, this.JWT_SECRET) as any;
      // Token'ın kara listelenip listelenmediğini kontrol et      const isBlacklisted = await this.isTokenBlacklisted(token);      if (isBlacklisted) {        throw new Error('Token kara listede');      }
      return decoded;    } catch (error) {      throw new Error('Geçersiz token');    }  }
  async refreshAccessToken(refreshToken: string) {    try {      const decoded = jwt.verify(refreshToken, this.JWT_SECRET) as any;
      // Refresh token'ın veritabanında var olduğunu doğrula      const isValid = await this.verifyRefreshToken(decoded.userId, refreshToken);      if (!isValid) {        throw new Error('Geçersiz refresh token');      }
      // Yeni access token oluştur      const user = await this.getUserById(decoded.userId);      return this.generateTokens(user.id, user.email);    } catch (error) {      throw new Error('Geçersiz refresh token');    }  }}

İyi yanları:

  • Tam kontrol: Auth akışlarının tam özelleştirmesi
  • Maliyet: Sadece altyapı maliyetleri
  • Öğrenme: Auth kavramlarını anlamak için harika
  • Esneklik: Herhangi bir auth pattern'ini uygulayabilirsiniz

Kötü yanları:

  • Güvenlik riskleri: Güvenlik hataları yapmak kolay
  • Bakım: Her şeyden siz sorumlusunuz
  • Uyumluluk: Yerleşik uyumluluk özellikleri yok
  • Zaman yatırımı: Önemli geliştirme süresi gerekli

Detaylı Karşılaştırma Matrisi

ÖzellikAuth0Firebase AuthSupabase AuthAWS CognitoÖzel JWT
Kurulum Süresi2-4 saat30 dakika1-2 saat4-8 saat1-2 hafta
Maliyet (100k kullanıcı)383$/ay1.000$/ay25$/ayDeğişken*20$/ay
Mobil DesteğiMükemmelMükemmelİyiİyiManuel
Web DesteğiMükemmelİyiMükemmelTemelManuel
API DesteğiMükemmelİyiİyiMükemmelManuel
Kurumsal ÖzelliklerMükemmelTemelSınırlıİyiManuel
UyumlulukSOC2, GDPR, HIPAATemelSınırlıSOC2, GDPRManuel
ÖzelleştirmeYüksekOrtaYüksekOrtaSınırsız
Satıcı KilitlenmesiYüksekYüksekOrtaYüksekYok
Öğrenme EğrisiOrtaDüşükOrtaYüksekYüksek

Gerçek Dünya Senaryoları: Her Birini Ne Zaman Kullanmalı

Senaryo 1: Kurumsal Müşterilerle B2B SaaS

Gereksinimler: SAML/SSO, uyumluluk, kullanıcı yönetimi, denetim logları Seçim: Auth0 Neden: Kurumsal özellikler, hazır uyumluluk, mükemmel admin paneli

Gerçek uygulama:

typescript
// Auth0 kurumsal yapılandırmasıconst auth0Config = {  domain: process.env.AUTH0_DOMAIN,  clientId: process.env.AUTH0_CLIENT_ID,  audience: process.env.AUTH0_AUDIENCE,  // Kurumsal özellikler  scope: 'openid profile email read:users write:users read:logs',  // SAML yapılandırması  samlConfiguration: {    signInUrl: process.env.SAML_SIGN_IN_URL,    signOutUrl: process.env.SAML_SIGN_OUT_URL,  },  // Kurumsal mantık için özel kurallar  rules: [    {      name: 'Kurumsal metadata ekle',      script: `        function (user, context, callback) {          // Kurumsal özel claim'ler ekle          context.idToken['https://myapp.com/enterprise'] = user.app_metadata.enterprise;          callback(null, user, context);        }      `    }  ]};

Senaryo 2: Mobil Öncelikli Tüketici Uygulaması

Gereksinimler: Sosyal giriş, push bildirimleri, hızlı geliştirme Seçim: Firebase Auth Neden: Mükemmel mobil entegrasyon, ücretsiz katman, Google ekosistemi

Gerçek uygulama:

typescript
// Sosyal giriş ile Firebase Authimport {  signInWithPopup,  GoogleAuthProvider,  FacebookAuthProvider} from 'firebase/auth';
const googleProvider = new GoogleAuthProvider();const facebookProvider = new FacebookAuthProvider();
// Sağlayıcıları yapılandırgoogleProvider.addScope('email');googleProvider.addScope('profile');facebookProvider.addScope('email');
// Sosyal giriş uygulamasıconst signInWithGoogle = async () => {  try {    const result = await signInWithPopup(auth, googleProvider);    const user = result.user;
    // Token'ı doğrulama için backend'e gönder    const token = await user.getIdToken();    await verifyTokenOnBackend(token);
    return user;  } catch (error) {    console.error('Google giriş hatası:', error);    throw error;  }};

Senaryo 3: Maliyet Bilinçli Startup

Gereksinimler: Düşük maliyet, PostgreSQL entegrasyonu, hızlı iterasyon Seçim: Supabase Auth Neden: 25$/ay'a sınırsız kullanıcı, doğrudan veritabanı erişimi

Gerçek uygulama:

typescript
// Özel kullanıcı metadata'sı ile Supabase Authconst { data: { user }, error } = await supabase.auth.signUp({  email: '[email protected]',  password: 'securepassword',  options: {    data: {      full_name: 'John Doe',      company: 'Startup Inc',      role: 'admin'    }  }});
// Özel mantık için doğrudan veritabanı sorgularıconst { data: users, error } = await supabase  .from('users')  .select('*')  .eq('company_id', companyId)  .order('created_at', { ascending: false });

Senaryo 4: AWS Ağırlıklı Mimari

Gereksinimler: Serverless, maliyet optimizasyonu, AWS entegrasyonu Seçim: AWS Cognito Neden: Sorunsuz Lambda entegrasyonu, ölçekte çok düşük maliyet

Gerçek uygulama:

typescript
// Lambda trigger'ları ile Cognitoimport { CognitoJwtVerifier } from 'aws-jwt-verify';
const verifier = CognitoJwtVerifier.create({  userPoolId: process.env.COGNITO_USER_POOL_ID,  tokenUse: 'access',  clientId: process.env.COGNITO_CLIENT_ID,});
// Cognito auth ile Lambda fonksiyonuexport const handler = async (event) => {  try {    const token = event.headers.Authorization?.replace('Bearer ', '');    const payload = await verifier.verify(token);
    // Kullanıcı kimliği doğrulandı, iş mantığı ile devam et    const userId = payload.sub;    const result = await processUserRequest(userId, event.body);
    return {      statusCode: 200,      body: JSON.stringify(result)    };  } catch (error) {    return {      statusCode: 401,      body: JSON.stringify({ error: 'Yetkisiz' })    };  }};

Senaryo 5: Öğrenme Projesi veya Basit Uygulama

Gereksinimler: Auth kavramlarını anlama, tam kontrol Seçim: Özel JWT Çözümü Neden: Eğitim değeri, satıcı bağımlılığı yok

Maliyet Analizi: Üretimden Gerçek Rakamlar

Üretimde gördüğüm gerçek maliyetleri açıklayayım:

Auth0 Maliyet Dağılımı

  • Ücretsiz katman: 7.000 aylık aktif kullanıcı
  • Essentials planı: 35/ay+1.000inu¨zerindekiMAUbas\cına0,0035/ay + 1.000'in üzerindeki MAU başına 0,0035
  • Professional planı: 240/ay+1.000inu¨zerindekiMAUbas\cına0,013/ay + 1.000'in üzerindeki MAU başına 0,013 (25.000 ücretsiz MAU dahil)
  • Gerçek örnek: 50k MAU = 35+(49k×0,0035 + (49k × 0,0035) = 206,50$/ay (Essentials)

Firebase Auth Maliyet Dağılımı

  • Ücretsiz katman: 50.000 aylık aktif kullanıcı
  • Ücretli katman: Ücretsiz katmanın üzerindeki MAU başına 0,02$
  • Gerçek örnek: 50k MAU = 0(u¨cretsizkatmanic\cinde);100kMAU=1.000 (ücretsiz katman içinde); 100k MAU = 1.000/ay

Supabase Auth Maliyet Dağılımı

  • Ücretsiz katman: 50.000 aylık aktif kullanıcı
  • Pro planı: 100.000 MAU'ya kadar 25$/ay
  • Ölçekten ödeme: 100.000'in üzerindeki MAU başına 0,00325$
  • Gerçek örnek: 100k MAU = 25/ay;150kMAU=25/ay; 150k MAU = 25 + (50k × 0,00325)=187,50) = 187,50/ay

AWS Cognito Maliyet Dağılımı

  • Yeni katman yapısı (2024 sonu): Lite, Essentials ve Plus planları farklı özellik setleriyle
  • Eski fiyatlandırma: İlk 50.000 MAU ücretsiz, sonra MAU başına 0,0055$ (yeni katmanlar geçerli)
  • Gerçek örnek: Fiyatlandırma seçilen katman ve özelliklere göre değişir; kullanım durumunuz için güncel oranları doğrulayın

Migrasyon Stratejileri: Gerçek Migrasyonlardan Dersler

Auth sağlayıcıları arasında birçok kez geçiş yaptım. İşte gerçekten işe yarayan stratejiler:

Özel JWT'den Auth0'a Migrasyon

typescript
// Kullanıcı verisi için migrasyon script'iconst migrateUsersToAuth0 = async () => {  const users = await getUsersFromCustomDB();
  for (const user of users) {    try {      // Auth0'da kullanıcı oluştur      const auth0User = await auth0Management.users.create({        email: user.email,        password: generateTemporaryPassword(),        email_verified: user.emailVerified,        user_metadata: {          migrated_from: 'custom_jwt',          original_user_id: user.id        }      });
      // Yerel veritabanını Auth0 kullanıcı ID'si ile güncelle      await updateUserAuth0Id(user.id, auth0User.user_id);
      console.log(`Kullanıcı taşındı: ${user.email}`);    } catch (error) {      console.error(`${user.email} kullanıcısını taşıma başarısız:`, error);    }  }};

Firebase'den Auth0'a Migrasyon

typescript
// Firebase'den Auth0'a migrasyonconst migrateFromFirebase = async () => {  const firebaseUsers = await getFirebaseUsers();
  for (const firebaseUser of firebaseUsers) {    try {      // Auth0'da kullanıcı oluştur      const auth0User = await auth0Management.users.create({        email: firebaseUser.email,        email_verified: firebaseUser.emailVerified,        user_metadata: {          firebase_uid: firebaseUser.uid,          migrated_at: new Date().toISOString()        }      });
      // Özel claim'leri taşı      if (firebaseUser.customClaims) {        await auth0Management.users.update(          { user_id: auth0User.user_id },          { app_metadata: firebaseUser.customClaims }        );      }
    } catch (error) {      console.error(`${firebaseUser.email} için migrasyon başarısız:`, error);    }  }};

Güvenlik Hususları: Zor Yoldan Öğrendiklerim

Token Güvenliği

typescript
// Güvenli token işlemeconst secureTokenStorage = {  // Token'ları güvenli sakla  storeTokens: (accessToken: string, refreshToken: string) => {    // Güvenli depolama kullan (hassas veriler için localStorage değil)    if (isMobile()) {      // Keychain (iOS) veya Keystore (Android) kullan      SecureStore.setItemAsync('access_token', accessToken);      SecureStore.setItemAsync('refresh_token', refreshToken);    } else {      // Web için httpOnly çerezler kullan      document.cookie = `access_token=${accessToken}; HttpOnly; Secure; SameSite=Strict`;    }  },
  // Token'ları düzenli olarak döndür  rotateTokens: async () => {    const refreshToken = await getRefreshToken();    const response = await fetch('/api/auth/refresh', {      method: 'POST',      headers: { 'Authorization': `Bearer ${refreshToken}` }    });
    if (response.ok) {      const { accessToken, refreshToken: newRefreshToken } = await response.json();      secureTokenStorage.storeTokens(accessToken, newRefreshToken);    }  }};

Rate Limiting

typescript
// Auth endpoint'leri için rate limitingconst rateLimit = require('express-rate-limit');
const authLimiter = rateLimit({  windowMs: 15 * 60 * 1000, // 15 dakika  max: 5, // Pencere başına 5 deneme  message: 'Çok fazla kimlik doğrulama denemesi, lütfen daha sonra tekrar deneyin',  standardHeaders: true,  legacyHeaders: false,  // Dağıtık sistemler için rate limit verisini Redis'te sakla  store: new RedisStore({    client: redisClient,    prefix: 'auth_rate_limit:'  })});
app.use('/api/auth/login', authLimiter);app.use('/api/auth/register', authLimiter);

Performans Optimizasyonu: Yüksek Trafikli Uygulamalardan Dersler

Token Önbellekleme

typescript
// Redis tabanlı token önbelleklemeclass TokenCache {  private redis: Redis;  private readonly CACHE_TTL = 3600; // 1 saat
  constructor() {    this.redis = new Redis(process.env.REDIS_URL);  }
  async cacheToken(userId: string, token: string): Promise<void> {    await this.redis.setex(`token:${userId}`, this.CACHE_TTL, token);  }
  async getCachedToken(userId: string): Promise<string | null> {    return await this.redis.get(`token:${userId}`);  }
  async invalidateToken(userId: string): Promise<void> {    await this.redis.del(`token:${userId}`);  }}

Bağlantı Havuzu

typescript
// Auth için veritabanı bağlantı havuzuconst pool = new Pool({  host: process.env.DB_HOST,  port: parseInt(process.env.DB_PORT),  database: process.env.DB_NAME,  user: process.env.DB_USER,  password: process.env.DB_PASSWORD,  // Auth sorguları için optimize et  max: 20,  idleTimeoutMillis: 30000,  connectionTimeoutMillis: 2000,  // Üretim için SSL'i etkinleştir  ssl: process.env.NODE_ENV === 'production' ? { rejectUnauthorized: false } : false});

Kimlik Doğrulama Sorunlarını Hata Ayıklama: Gerçek Hikayeler

Kaybolan Kullanıcılar Vakası

Sorun: Kullanıcılar Auth0'da oluşturuluyordu ancak veritabanımızda görünmüyordu Kök neden: Auth0 webhook'u ile kullanıcı oluşturma arasında yarış durumu Çözüm: Uygun hata işleme ile idempotent kullanıcı oluşturma uygulandı

typescript
// Idempotent kullanıcı oluşturmaconst createUserIfNotExists = async (auth0User: any) => {  const existingUser = await db.user.findUnique({    where: { auth0Id: auth0User.user_id }  });
  if (existingUser) {    return existingUser;  }
  try {    return await db.user.create({      data: {        auth0Id: auth0User.user_id,        email: auth0User.email,        emailVerified: auth0User.email_verified,        metadata: auth0User.user_metadata      }    });  } catch (error) {    // Yarış durumunu ele al    if (error.code === 'P2002') {      return await db.user.findUnique({        where: { auth0Id: auth0User.user_id }      });    }    throw error;  }};

Token Doğrulama Gizemi

Sorun: API çağrıları aralıklı olarak "geçersiz token" hatalarıyla başarısız oluyordu Kök neden: Sunucular ve Auth0 arasında saat kayması Çözüm: Saat kayması toleransı ile token doğrulama uygulandı

typescript
// Saat kayması toleransı ile token doğrulamaconst validateToken = async (token: string) => {  try {    const decoded = jwt.verify(token, process.env.AUTH0_PUBLIC_KEY, {      algorithms: ['RS256'],      clockTolerance: 30, // 30 saniye tolerans      issuer: `https://${process.env.AUTH0_DOMAIN}/`,      audience: process.env.AUTH0_AUDIENCE    });
    return decoded;  } catch (error) {    console.error('Token doğrulama hatası:', error);    throw new Error('Geçersiz token');  }};

Karar Çerçevesi ve Öneriler

Çerçeve Analizi Uygulaması

Altı boyutlu çerçeveyi gerçek dünya senaryolarına uygulamak net optimizasyon kalıpları ortaya çıkarır:

Yeni Projeler İçin

  • Firebase Auth: Google Cloud entegrasyonlu mobil öncelikli tüketici uygulamaları
  • Supabase Auth: Maliyet optimizasyonu gerektiren PostgreSQL ağırlıklı startup'lar
  • Auth0: Anında uyumluluk ve SSO gerektiren kurumsal uygulamalar
  • AWS Cognito: Yüksek ölçek gereksinimli AWS-native serverless mimariler

Mevcut Projeler İçin

  • Gerekli olmadıkça geçiş yapmayın: Auth migrasyonları önemli risk ve karmaşıklık taşır
  • Kapsamlı izleme uygulayın: Mimari değişikliklerden önce mevcut performansı ölçün
  • Kademeli geçiş yolları tasarlayın: Çift auth sistemleri risk azaltmaya olanak sağlar
  • Test titizliğine öncelik verin: Auth hataları tüm kullanıcı deneyimini etkiler

Stratejik Uygulama Kılavuzları

Maliyet Optimizasyonu

  1. Kullanım kalıplarını izleyin ve buna göre optimize edin
  2. Auth sağlayıcı çağrılarını azaltmak için uygun önbellekleme uygulayın
  3. Token oluşturmayı minimize etmek için refresh token'ları kullanın
  4. Farklı kullanıcı segmentleri için hibrit yaklaşımları düşünün

Güvenlik Temeli

  1. Token'ları her zaman sunucu tarafında doğrulayın - istemci tarafı doğrulamaya asla güvenmeyin
  2. Güvenli token depolama ile uygun oturum yönetimi uygulayın
  3. Her yerde HTTPS kullanın - özellikle auth endpoint'leri için
  4. Auth uygulamanızın düzenli güvenlik denetimleri
  5. Şüpheli aktiviteyi izleyin ve rate limiting uygulayın

Performans Optimizasyonu

  1. Veritabanı sorgularını azaltmak için kullanıcı oturumlarını önbelleğe alın
  2. Veritabanı bağlantıları için bağlantı havuzu kullanın
  3. Auth sağlayıcı API çağrılarını azaltmak için token önbellekleme uygulayın
  4. Uygun algoritmalar ve önbellekleme ile token doğrulamayı optimize edin
  5. Auth performansını izleyin ve darboğazları optimize edin

Organizasyonel Hususlar

  1. Takım uzmanlığına göre seçin - kimse AWS bilmiyorsa Cognito'yu seçmeyin
  2. Bakım yükünü düşünün - özel çözümler sürekli çalışma gerektirir
  3. Takım büyümesini planlayın - auth sistemleri takımınızla ölçeklenmeli
  4. Her şeyi belgeleyin - auth kritik altyapıdır
  5. Yedek planınız olsun - gerektiğinde nasıl geçiş yapacağınızı her zaman bilin

Önemli Fiyatlandırma Uyarısı: Kimlik doğrulama sağlayıcılarının fiyatlandırması sıkça değişir. Bu kılavuzdaki tüm maliyet örnekleri 2025 oranlarını yansıtmaktadır ancak karar vermeden önce güncel sağlayıcı fiyatlandırma sayfalarından doğrulanmalıdır. Geliştirme süresi, bakım ve potansiyel geçiş maliyetleri dahil toplam sahip olma maliyetini göz önünde bulundurun.

Sonuç

Doğru auth sağlayıcısını seçmek, "en iyi" çözümü bulmaktan çok özel gereksinimlerinizi anlamakla ilgilidir. Her sağlayıcının güçlü ve zayıf yönleri vardır ve doğru seçim takımınızın uzmanlığına, bütçenize, uyumluluk gereksinimlerinize ve teknik kısıtlamalarınıza bağlıdır.

Öğrendiğim en önemli ders, basit başlamak ve uygulamanız büyüdükçe auth stratejinizi geliştirmektir. İlk günden kimlik doğrulamayı aşırı mühendislik yapmayın, ancak seçiminizin güvenlik ve ölçeklenebilirlik etkilerini de göz ardı etmeyin.

Unutmayın: kimlik doğrulama sadece güvenlikle ilgili değildir - kullanıcı deneyimi, geliştirici deneyimi ve iş gereksinimleriyle ilgilidir. Akıllıca seçin, dikkatli uygulayın ve her zaman bir yedek planınız olsun.

İlgili Yazılar