101 lines
2.8 KiB
JavaScript
101 lines
2.8 KiB
JavaScript
const passport = require('passport');
|
||
const { PrismaClient } = require('@prisma/client');
|
||
|
||
const prisma = new PrismaClient();
|
||
|
||
// Kullanıcıyı session'a serialize et
|
||
passport.serializeUser((user, done) => {
|
||
done(null, user.id);
|
||
});
|
||
|
||
// Session'dan kullanıcıyı deserialize et
|
||
passport.deserializeUser(async (id, done) => {
|
||
try {
|
||
const user = await prisma.user.findUnique({
|
||
where: { id },
|
||
select: {
|
||
id: true,
|
||
email: true,
|
||
username: true,
|
||
firstName: true,
|
||
lastName: true,
|
||
avatar: true,
|
||
authProvider: true,
|
||
isActive: true,
|
||
isAdmin: true
|
||
}
|
||
});
|
||
done(null, user);
|
||
} catch (error) {
|
||
done(error, null);
|
||
}
|
||
});
|
||
|
||
// Google OAuth Strategy - Sadece credentials varsa yükle
|
||
if (process.env.GOOGLE_CLIENT_ID && process.env.GOOGLE_CLIENT_SECRET) {
|
||
const GoogleStrategy = require('passport-google-oauth20').Strategy;
|
||
|
||
passport.use(new GoogleStrategy({
|
||
clientID: process.env.GOOGLE_CLIENT_ID,
|
||
clientSecret: process.env.GOOGLE_CLIENT_SECRET,
|
||
callbackURL: process.env.GOOGLE_CALLBACK_URL || "/api/auth/google/callback"
|
||
}, async (accessToken, refreshToken, profile, done) => {
|
||
try {
|
||
// Önce Google ID ile kullanıcı ara
|
||
let user = await prisma.user.findUnique({
|
||
where: { googleId: profile.id }
|
||
});
|
||
|
||
if (user) {
|
||
// Kullanıcı zaten var, son giriş tarihini güncelle
|
||
user = await prisma.user.update({
|
||
where: { id: user.id },
|
||
data: { lastLoginAt: new Date() }
|
||
});
|
||
return done(null, user);
|
||
}
|
||
|
||
// Email ile kullanıcı ara (mevcut hesap varsa bağla)
|
||
user = await prisma.user.findUnique({
|
||
where: { email: profile.emails[0].value }
|
||
});
|
||
|
||
if (user) {
|
||
// Mevcut hesabı Google ile bağla
|
||
user = await prisma.user.update({
|
||
where: { id: user.id },
|
||
data: {
|
||
googleId: profile.id,
|
||
authProvider: 'google',
|
||
avatar: profile.photos[0]?.value || user.avatar,
|
||
lastLoginAt: new Date()
|
||
}
|
||
});
|
||
return done(null, user);
|
||
}
|
||
|
||
// Yeni kullanıcı oluştur
|
||
const username = profile.emails[0].value.split('@')[0] + '_' + Math.random().toString(36).substr(2, 4);
|
||
|
||
user = await prisma.user.create({
|
||
data: {
|
||
email: profile.emails[0].value,
|
||
username: username,
|
||
firstName: profile.name.givenName || '',
|
||
lastName: profile.name.familyName || '',
|
||
googleId: profile.id,
|
||
authProvider: 'google',
|
||
avatar: profile.photos[0]?.value,
|
||
lastLoginAt: new Date()
|
||
}
|
||
});
|
||
|
||
return done(null, user);
|
||
} catch (error) {
|
||
console.error('Google OAuth Error:', error);
|
||
return done(error, null);
|
||
}
|
||
}));
|
||
}
|
||
|
||
module.exports = passport; |