|
const { Strategy: GoogleStrategy } = require('passport-google-oauth20'); |
|
const User = require('../models/User'); |
|
const config = require('../../config/loader'); |
|
const domains = config.domains; |
|
|
|
const googleLogin = async (accessToken, refreshToken, profile, cb) => { |
|
try { |
|
const email = profile.emails[0].value; |
|
const googleId = profile.id; |
|
const oldUser = await User.findOne({ email }); |
|
const ALLOW_SOCIAL_REGISTRATION = |
|
process.env.ALLOW_SOCIAL_REGISTRATION?.toLowerCase() === 'true'; |
|
|
|
if (oldUser) { |
|
oldUser.avatar = profile.photos[0].value; |
|
await oldUser.save(); |
|
return cb(null, oldUser); |
|
} else if (ALLOW_SOCIAL_REGISTRATION) { |
|
const newUser = await new User({ |
|
provider: 'google', |
|
googleId, |
|
username: profile.name.givenName, |
|
email, |
|
emailVerified: profile.emails[0].verified, |
|
name: `${profile.name.givenName} ${profile.name.familyName}`, |
|
avatar: profile.photos[0].value, |
|
}).save(); |
|
|
|
return cb(null, newUser); |
|
} |
|
|
|
return cb(null, false, { message: 'User not found.' }); |
|
} catch (err) { |
|
console.error(err); |
|
return cb(err); |
|
} |
|
}; |
|
|
|
module.exports = () => |
|
new GoogleStrategy( |
|
{ |
|
clientID: process.env.GOOGLE_CLIENT_ID, |
|
clientSecret: process.env.GOOGLE_CLIENT_SECRET, |
|
callbackURL: `${domains.server}${process.env.GOOGLE_CALLBACK_URL}`, |
|
proxy: true, |
|
}, |
|
googleLogin, |
|
); |
|
|