Node.js İle Passport.js Kullanarak Sosyal Medya Girişi Nasıl Yapılır?

Node.js İle Passport.js Kullanarak Sosyal Medya Girişi Nasıl Yapılır?
Node.js İle Passport.js Kullanarak Sosyal Medya Girişi Nasıl Yapılır?

Gereksinimler ve Ön Hazırlık

Projeye başlamadan önce bilgisayarınızda Node.js'in güncel bir LTS (Long Term Support) sürümünün yüklü olduğundan emin olun. Geliştirme ortamınızda aşağıdaki paketleri yükleyerek işe başlayacağız.

  • Node.js (v20 veya üzeri önerilir)
  • Express.js (Web sunucusu çatısı)
  • Passport.js (Kimlik doğrulama ara katmanı)
  • passport-google-oauth20 (Google stratejisi)
  • dotenv (Çevresel değişkenleri yönetmek için)

İlk adım olarak projenizi oluşturun ve gerekli bağımlılıkları yükleyin:

mkdir sosyal-giris-projesi
cd sosyal-giris-projesi
npm init -y
npm install express passport passport-google-oauth20 express-session dotenv

Bu komutlar, projenizin temel iskeletini kuracak ve kimlik doğrulama için gerekli olan kütüphaneleri çalışma dizininize indirecektir.

Google Cloud Console Üzerinde Uygulama Kaydı

Sosyal medya girişi için Google'ın OAuth sunucularıyla konuşmanız gerekir. Bunun için Google Cloud Console üzerinden bir proje oluşturmalı ve "Client ID" ile "Client Secret" bilgilerini almalısınız.

  1. Google Cloud Console paneline gidin.
  2. "APIs & Services" kısmından "Credentials" sekmesine tıklayın.
  3. "Create Credentials" diyerek "OAuth client ID" seçeneğini seçin.
  4. "Authorized redirect URIs" kısmına http://localhost:3000/auth/google/callback adresini ekleyin.
Kritik Uyarı: Client ID ve Client Secret bilgilerini asla kodunuzun içine doğrudan yazmayın. Bu bilgiler uygulamanızın güvenliği için hayati önem taşır; mutlaka bir .env dosyasında saklayın ve bu dosyayı versiyon kontrol sisteminize (Git) dahil etmeyin.

Passport.js Yapılandırması

Şimdi Passport.js'i Google stratejisi ile yapılandıralım. Bu adım, kullanıcının Google üzerinden kimliğini doğruladıktan sonra uygulamanızın bu veriyi nasıl işleyeceğini belirler.

require('dotenv').config();
const passport = require('passport');
const GoogleStrategy = require('passport-google-oauth20').Strategy;

passport.use(new GoogleStrategy({
    clientID: process.env.GOOGLE_CLIENT_ID,
    clientSecret: process.env.GOOGLE_CLIENT_SECRET,
    callbackURL: "http://localhost:3000/auth/google/callback"
  },
  (accessToken, refreshToken, profile, cb) => {
    // Burada kullanıcıyı veritabanınızda bulabilir veya oluşturabilirsiniz
    return cb(null, profile);
  }
));

passport.serializeUser((user, done) => done(null, user));
passport.deserializeUser((user, done) => done(null, user));

Yukarıdaki kod, Passport'un Google ile nasıl iletişim kuracağını ve oturum açan kullanıcıyı nasıl serileştireceğini (oturumda tutacağını) tanımlar.

Express.js Sunucusunu Kurma

Sunucunuzun gelen istekleri karşılaması ve Passport'u kullanması için gerekli olan Express rotalarını tanımlayalım. Bu yapı, kullanıcının giriş yapmaya başladığı ve Google'dan döndüğü noktaları yönetir.

const express = require('express');
const session = require('express-session');
const app = express();

app.use(session({ secret: 'gizli-anahtar', resave: false, saveUninitialized: true }));
app.use(passport.initialize());
app.use(passport.session());

app.get('/auth/google', passport.authenticate('google', { scope: ['profile', 'email'] }));

app.get('/auth/google/callback', 
  passport.authenticate('google', { failureRedirect: '/login' }),
  (req, res) => {
    res.redirect('/profil');
  }
);

app.listen(3000, () => console.log('Sunucu 3000 portunda çalışıyor.'));

Burada scope parametresi, Google'dan kullanıcının hangi bilgilerini (profil ve e-posta) istediğimizi belirtir.

Kimlik Doğrulama Yöntemlerinin Karşılaştırılması

Sosyal medya girişi ile geleneksel yöntemleri şu şekilde kıyaslayabiliriz:

Özellik Geleneksel (E-posta/Şifre) Sosyal Medya (OAuth)
Kullanıcı Deneyimi Düşük (Form doldurma) Yüksek (Tek tık)
Güvenlik Riskli (Zayıf şifreler) Yüksek (Google/Meta koruması)
Entegrasyon Zor (Şifre sıfırlama vb.) Kolay (SDK/Kütüphane)

Güvenlik İpuçları ve Yaygın Hatalar

Sosyal medya girişi entegrasyonunda en büyük hata, kullanıcı bilgilerini düzgün doğrulamamaktır. Her zaman https protokolü kullanın ve üretim ortamında (production) express-session için secure: true ayarını aktif edin.

Kod Güvenliği Sorumluluk Reddi: Bu rehberdeki kod örnekleri eğitim amaçlıdır. Üretim ortamına geçmeden önce veritabanı bağlantılarınızı, oturum yönetimi güvenlik ayarlarınızı (CSRF koruması, HTTPOnly çerezler) ve hata yönetimi mekanizmalarınızı profesyonel standartlara göre yapılandırdığınızdan emin olun.

Sıkça Sorulan Sorular

Passport.js neden kullanılır?

Passport.js, kimlik doğrulama sürecini uygulamanın geri kalanından ayırarak modüler ve temiz bir kod yapısı sunar. 500'den fazla stratejiyi desteklemesi, farklı servislerle entegrasyonu kolaylaştırır.

Kullanıcı bilgilerini veritabanında nasıl saklamalıyım?

Google'dan gelen benzersiz id (sub) değerini veritabanınızda birincil anahtar veya benzersiz bir indeks olarak saklamanız önerilir. E-posta adresi değişebileceği için ID üzerinden takip yapmak daha güvenlidir.

Neden "Unauthorized" hatası alıyorum?

Bu hata genellikle Google Cloud Console'da tanımladığınız "Redirect URI" ile kodunuzdaki callbackURL'in eşleşmemesinden kaynaklanır. Her iki değerin birebir aynı olduğundan emin olun.

Birden fazla sosyal medya sağlayıcısı ekleyebilir miyim?

Evet, aynı mantıkla passport-facebook veya passport-github gibi stratejileri projenize ekleyerek çoklu giriş seçenekleri sunabilirsiniz.

Oturum süresi nasıl yönetilir?

express-session konfigürasyonunda cookie.maxAge değerini ayarlayarak kullanıcının oturumunun ne kadar süre geçerli kalacağını kontrol edebilirsiniz.

İleri Düzey Hata Ayıklama ve Loglama Stratejileri

Passport.js süreçlerinde karşılaşılan hataların çoğu, yapılandırma dosyalarındaki yanlış yönlendirme (callback URL) veya eksik izinlerden kaynaklanır. Uygulamanızın üretim (production) ortamına geçmeden önce, kimlik doğrulama akışını şeffaf bir şekilde izlemek için bir ara katman (middleware) oluşturmak hata ayıklama sürecini ciddi oranda hızlandırır.

Özellikle serializeUser ve deserializeUser fonksiyonlarında meydana gelen hatalar, kullanıcının oturumunun neden sonlandığını anlamanızı zorlaştırabilir. Aşağıdaki örnekte, her kimlik doğrulama adımını konsola yazdıran basit bir izleme mekanizmasını görebilirsiniz:


// Hata ayıklama için izleme middleware'i
app.use((req, res, next) => {
  console.log(`İstek Yolu: ${req.path}`);
  console.log(`Oturum Durumu: ${req.isAuthenticated() ? 'Giriş Yapıldı' : 'Giriş Yapılmadı'}`);
  console.log(`Kullanıcı: ${req.user ? req.user.id : 'Yok'}`);
  next();
});

Ayrıca, Passport.js stratejilerinde hata yakalamak için failureFlash ve failureRedirect seçeneklerini kullanmak, kullanıcıya hatanın nedenini bildirmek için kritik öneme sahiptir:


app.get('/auth/google/callback', 
  passport.authenticate('google', { 
    failureRedirect: '/login',
    failureFlash: 'Kimlik doğrulama başarısız oldu, lütfen tekrar deneyin.' 
  }),
  (req, res) => {
    res.redirect('/dashboard');
  }
);

Üretim Ortamında (Deployment) Güvenlik İpuçları

Uygulamanızı canlıya alırken, geliştirme ortamında kullandığınız varsayılan ayarlar güvenlik açığı oluşturabilir. Özellikle express-session konfigürasyonu, üretim ortamında mutlaka HTTPS üzerinden çalışacak şekilde yapılandırılmalıdır.

Güvenli Çerez (Cookie) Yapılandırması

Canlı ortamda çerezlerin çalınmasını önlemek için secure ve httpOnly bayraklarını aktif etmeniz zorunludur. Aksi takdirde, oturum anahtarlarınız ağ trafiğinde yakalanabilir.


const sessionConfig = {
  secret: process.env.SESSION_SECRET,
  resave: false,
  saveUninitialized: false,
  cookie: {
    httpOnly: true, // JavaScript ile çereze erişimi engeller
    secure: process.env.NODE_ENV === 'production', // Sadece HTTPS üzerinden gönderir
    maxAge: 1000 * 60 * 60 * 24 // 24 saat
  }
};

app.use(session(sessionConfig));

Çevresel Değişkenlerin Yönetimi

OAuth istemci kimliklerini (Client ID ve Client Secret) asla kod içerisinde doğrudan paylaşmayın. Bunun yerine dotenv kütüphanesini kullanarak bu bilgileri sistem ortam değişkenlerinden okuyun. Sunucunuzda (Heroku, AWS, DigitalOcean vb.) bu değişkenleri "Environment Variables" panelinden tanımladığınızdan emin olun.

Güvenlik Katmanı Önemi
HTTPS Zorunluluğu Veri iletimini şifreler, MITM saldırılarını önler.
Strict-Transport-Security Tarayıcıyı sadece HTTPS kullanmaya zorlar.
CORS Politikası Yetkisiz alan adlarından gelen istekleri reddeder.

Bu yapılandırmalar, uygulamanızın sadece işlevsel değil, aynı zamanda kurumsal standartlarda güvenli bir kimlik doğrulama altyapısına sahip olmasını sağlar.

Sonuç

Node.js ve Passport.js kullanarak sosyal medya girişi eklemek, hem kullanıcılarınızın işini kolaylaştırır hem de uygulamanızın kimlik doğrulama güvenliğini üst seviyeye taşır. Bu rehberde öğrendiğiniz temel yapı, üzerine inşa edebileceğiniz sağlam bir başlangıçtır. Bir sonraki adım olarak, kullanıcılar giriş yaptıktan sonra onları veritabanınızdaki bir kullanıcı tablosuyla eşleştirmeyi ve JWT (JSON Web Token) kullanarak API güvenliğini sağlamayı deneyebilirsiniz.

Bu yazıya tepkinizi paylaşın:
Deniz Arslan

On yıldır dijital içerik üretimi ve editörlük alanında çalışıyorum. Karmaşık süreçleri herkesin anlayabileceği basit ve adım adım rehberlere dönüştürme konusunda uzmanım.

Yorumlar (0)

Yorum Yaz