From 3a9bf5409be87fd81c0e8305909537a97de89bf2 Mon Sep 17 00:00:00 2001 From: Sheen Capadngan Date: Sun, 6 Aug 2023 21:46:20 +0800 Subject: [PATCH] finalization of create token logic --- backend/src/controllers/v3/authController.ts | 14 +++---- backend/src/helpers/auth.ts | 5 +-- backend/src/models/user.ts | 1 + backend/src/utils/auth.ts | 39 ++++++++++---------- 4 files changed, 29 insertions(+), 30 deletions(-) diff --git a/backend/src/controllers/v3/authController.ts b/backend/src/controllers/v3/authController.ts index 69aa8874e..831cb81b7 100644 --- a/backend/src/controllers/v3/authController.ts +++ b/backend/src/controllers/v3/authController.ts @@ -56,10 +56,9 @@ export const login1 = async (req: Request, res: Response) => { if (!user) throw new Error("Failed to find user"); - const shouldValidateProviderAuth = (user.authProvider && user.authProvider !== AuthProvider.EMAIL) - || (user.authProviders && !user.authProviders?.includes(AuthProvider.EMAIL)) - - if (shouldValidateProviderAuth) { + let authProviders = [...(user.authProviders || []), user.authProvider]; + + if (!authProviders.includes(AuthProvider.EMAIL)) { await validateProviderAuthToken({ email, user, @@ -119,10 +118,9 @@ export const login2 = async (req: Request, res: Response) => { if (!user) throw new Error("Failed to find user"); - const shouldValidateProviderAuth = (user.authProvider && user.authProvider !== AuthProvider.EMAIL) - || (user.authProviders && !user.authProviders?.includes(AuthProvider.EMAIL)) - - if (shouldValidateProviderAuth) { + let authProviders = [...(user.authProviders || []), user.authProvider]; + + if (!authProviders.includes(AuthProvider.EMAIL)) { await validateProviderAuthToken({ email, user, diff --git a/backend/src/helpers/auth.ts b/backend/src/helpers/auth.ts index f6b676a36..5e5101ce7 100644 --- a/backend/src/helpers/auth.ts +++ b/backend/src/helpers/auth.ts @@ -390,11 +390,10 @@ export const validateProviderAuthToken = async ({ jwt.verify(providerAuthToken, await getJwtProviderAuthSecret()) ); - const doesProviderMatch = (user.authProvider && user.authProvider === decodedToken.authProvider) - || (user.authProviders && user.authProviders.includes(decodedToken.authProvider)); + let authProviders = [...(user.authProviders || []), user.authProvider]; if ( - !doesProviderMatch || + !authProviders.includes(decodedToken.authProvider) || decodedToken.email !== email ) { throw new Error("Invalid authentication credentials.") diff --git a/backend/src/models/user.ts b/backend/src/models/user.ts index 9251c487d..852214d52 100644 --- a/backend/src/models/user.ts +++ b/backend/src/models/user.ts @@ -46,6 +46,7 @@ const userSchema = new Schema( }, authProviders: [{ type: String, + enum: AuthProvider, }], email: { type: String, diff --git a/backend/src/utils/auth.ts b/backend/src/utils/auth.ts index 3fdd5915f..b58a135c9 100644 --- a/backend/src/utils/auth.ts +++ b/backend/src/utils/auth.ts @@ -97,20 +97,22 @@ const initializePassport = async () => { email }).select("+publicKey"); - if (user && user.authProvider !== AuthProvider.GOOGLE) { - done(InternalServerError()); - } - if (!user) { user = await new User({ email, - authProvider: AuthProvider.GOOGLE, + authProviders: [AuthProvider.GOOGLE], authId: profile.id, firstName: profile.name.givenName, lastName: profile.name.familyName }).save(); } + let authProviders = [...(user.authProviders || []), user.authProvider]; + + if (!authProviders.includes(AuthProvider.GOOGLE)) { + done(InternalServerError()); + } + const isUserCompleted = !!user.publicKey; const providerAuthToken = createToken({ payload: { @@ -118,8 +120,7 @@ const initializePassport = async () => { email: user.email, firstName: user.firstName, lastName: user.lastName, - authProvider: user.authProvider, - authProviders: user.authProviders, + authProvider: AuthProvider.GOOGLE, isUserCompleted, ...(req.query.state ? { callbackPort: req.query.state as string @@ -151,21 +152,23 @@ const initializePassport = async () => { let user = await User.findOne({ email }).select("+publicKey"); - - if (user && user.authProvider !== AuthProvider.GITHUB) { - done(InternalServerError()); - } - + if (!user) { user = await new User({ email: email, - authProvider: AuthProvider.GITHUB, + authProviders: [AuthProvider.GITHUB], authId: profile.id, firstName: profile.displayName, lastName: "" }).save(); } + let authProviders = [...(user.authProviders || []), user.authProvider]; + + if (!authProviders.includes(AuthProvider.GITHUB)) { + done(InternalServerError()); + } + const isUserCompleted = !!user.publicKey; const providerAuthToken = createToken({ payload: { @@ -173,8 +176,7 @@ const initializePassport = async () => { email: user.email, firstName: user.firstName, lastName: user.lastName, - authProvider: user.authProvider, - authProviders: user.authProviders, + authProvider: AuthProvider.GITHUB, isUserCompleted, ...(req.query.state ? { callbackPort: req.query.state as string @@ -249,7 +251,7 @@ const initializePassport = async () => { await User.findByIdAndUpdate( user._id, { - authProvider: req.ssoConfig.authProvider + authProviders: [req.ssoConfig.authProvider] }, { new: true @@ -281,7 +283,7 @@ const initializePassport = async () => { } else { user = await new User({ email, - authProvider: req.ssoConfig.authProvider, + authProviders: [req.ssoConfig.authProvider], firstName, lastName }).save(); @@ -303,8 +305,7 @@ const initializePassport = async () => { firstName, lastName, organizationName: organization?.name, - authProvider: user.authProvider, - authProviders: user.authProviders, + authProvider: req.ssoConfig.authProvider, isUserCompleted, ...(req.body.RelayState ? { callbackPort: req.body.RelayState as string