From 1880b300291c8574998952cad59ccd579e5fe3ea Mon Sep 17 00:00:00 2001 From: "Lin, Hung-Shin" Date: Thu, 5 Oct 2023 11:50:00 +0800 Subject: [PATCH] feat: use google to login --- server/src/auth/googleStrategy.js | 34 ++++++++++++++++++++++++++++++- server/src/models/user.js | 7 ++++++- 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/server/src/auth/googleStrategy.js b/server/src/auth/googleStrategy.js index c126893..f901c43 100644 --- a/server/src/auth/googleStrategy.js +++ b/server/src/auth/googleStrategy.js @@ -1,6 +1,7 @@ import GoogleStrategy from 'passport-google-oidc' import config from '../config.js' +import User from '../models/user.js' console.log('Google config:', config.google) @@ -13,6 +14,37 @@ export default new GoogleStrategy( }, function verify(issuer, profile, cb) { console.log('Get a google login:', profile) - return cb(null, profile) + + process.nextTick(async () => { + const email = profile.emails[0]?.value + if (!email) { + cb(new Error('No email found')) + return + } + + let user = await User.findOne({ 'google.id': profile.id }) + if (!user) { + user = await User.findOne({ email }) + const google = { + id: profile.id, + displayName: profile.displayName, + } + console.log('Existing user:', user) + if (!user) { + user = new User({ + email, + google, + }) + } else if (user.google?.id) { + cb(new Error('Email already used and binded to another account')) + return + } else { + user.google = google + } + await user.save() + } + + cb(null, user) + }) } ) diff --git a/server/src/models/user.js b/server/src/models/user.js index 5899e90..1c3b891 100644 --- a/server/src/models/user.js +++ b/server/src/models/user.js @@ -4,7 +4,8 @@ const User = model('User', { username: { type: String, unique: true, - required: true, + required: false, // should be required, + // but need to let social login users to pick one after login }, email: { type: String, @@ -12,6 +13,10 @@ const User = model('User', { required: true, }, hashedPassword: String, + google: { + id: String, + displayName: String, + }, }) export default User