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.
- Google Cloud Console paneline gidin.
- "APIs & Services" kısmından "Credentials" sekmesine tıklayın.
- "Create Credentials" diyerek "OAuth client ID" seçeneğini seçin.
- "Authorized redirect URIs" kısmına
http://localhost:3000/auth/google/callbackadresini 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.

Yorumlar (0)
Yorum Yaz