File size: 2,037 Bytes
9470e9f 2c9c0b3 9470e9f 559a977 9470e9f 2c9c0b3 9470e9f 2c9c0b3 9470e9f 559a977 9470e9f |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 |
import passport from 'passport';
import { Strategy as GoogleStrategy } from 'passport-google-oauth20';
import User from '../models/User.js';
async function generateUniqueUsername(email) {
const base = email
.split('@')[0]
.toLowerCase()
.replace(/[^a-z0-9]/g, '_')
.slice(0, 15); // leave room for suffix
let username = base;
let suffix = 0;
while (await User.exists({ username })) {
suffix += 1;
username = `${base}_${suffix}`;
}
return username;
}
passport.serializeUser((user, done) => {
done(null, user.id); // Save only ID to session
});
passport.deserializeUser(async (id, done) => {
try {
const user = await User.findById(id);
done(null, user); // Attach full user object to req.user
} catch (err) {
done(err, null);
}
});
passport.use(
new GoogleStrategy(
{
clientID: process.env.GOOGLE_CLIENT_ID,
clientSecret: process.env.GOOGLE_CLIENT_SECRET,
callbackURL: 'https://cragy.fun/api/auth/google/callback',
proxy: true // Important for Cloudflare/HuggingFace proxies
},
async (accessToken, refreshToken, profile, done) => {
try {
// Check if user exists
const existingUser = await User.findOne({ googleId: profile.id });
if (existingUser) {
return done(null, existingUser);
}
const email = profile.emails[0].value;
// 👇 AUTO-GENERATE USERNAME
const username = await generateUniqueUsername(email);
// Create new user
const newUser = await new User({
googleId: profile.id,
email: profile.emails[0].value,
username,
displayName: profile.displayName,
firstName: profile.name.givenName,
lastName: profile.name.familyName,
profile: {
isComplete: false,
karma: 60 // Default Karma
}
}).save();
done(null, newUser);
} catch (err) {
console.error("Auth Error:", err);
done(err, null);
}
}
)
); |