From 455fde41ab6d646995fc718de61fcd00fda6137a Mon Sep 17 00:00:00 2001 From: wancat Date: Fri, 5 Apr 2024 17:56:09 +0800 Subject: [PATCH] fix: OAuth flow by setting scope and cookie to 'lax' --- server/src/api/routes/authRouter.ts | 5 ++++- server/src/auth/oauthVerify.ts | 2 ++ server/src/auth/passport.ts | 6 ++++-- server/src/middleware/error.ts | 2 +- server/src/middleware/session.ts | 2 +- 5 files changed, 12 insertions(+), 5 deletions(-) diff --git a/server/src/api/routes/authRouter.ts b/server/src/api/routes/authRouter.ts index 956a4c6..9fabc58 100644 --- a/server/src/api/routes/authRouter.ts +++ b/server/src/api/routes/authRouter.ts @@ -46,7 +46,10 @@ router.get('/available-methods', (req, res) => { }) if (enabledMethods.google) { - router.get('/google', passport.authenticate('google')) + router.get( + '/google', + passport.authenticate('google', { scope: ['email', 'profile'] }) + ) router.get( '/google/callback', authenticateRateLimit, diff --git a/server/src/auth/oauthVerify.ts b/server/src/auth/oauthVerify.ts index 9daf3b8..262e373 100644 --- a/server/src/auth/oauthVerify.ts +++ b/server/src/auth/oauthVerify.ts @@ -1,6 +1,7 @@ import { User } from '@linux-odyssey/models' import type { Profile } from 'passport' import type { VerifyCallback } from 'passport-oauth2' +import logger from '../utils/logger.js' export default async function oauthVerify( provider: string, @@ -37,6 +38,7 @@ export default async function oauthVerify( email: user.email, }) } catch (err) { + logger.error(err) return cb( err instanceof Error ? err : new Error('An unknown error occurred') ) diff --git a/server/src/auth/passport.ts b/server/src/auth/passport.ts index 1d9bf15..a7f9041 100644 --- a/server/src/auth/passport.ts +++ b/server/src/auth/passport.ts @@ -1,6 +1,6 @@ import passport from 'passport' -import { UserProfile } from '@linux-odyssey/models' import type { Express } from 'express' +import { UserProfile } from '@linux-odyssey/models' import passwordStrategy from './passwordStrategy.js' import jwtStrategy from './jwtStrategy.js' import googleStrategy from './googleStrategy.js' @@ -30,7 +30,8 @@ passport.serializeUser((user: Express.User, done) => { process.nextTick(async () => { try { if (!('id' in user)) { - done(new Error('User has no _id')) + // OAuth new user + done(null, user) return } const { id } = user @@ -39,6 +40,7 @@ passport.serializeUser((user: Express.User, done) => { } done(null, user) } catch (err) { + logger.error(err) done(err) } }) diff --git a/server/src/middleware/error.ts b/server/src/middleware/error.ts index 84081cf..a9fe768 100644 --- a/server/src/middleware/error.ts +++ b/server/src/middleware/error.ts @@ -13,7 +13,7 @@ export default function errorHandler( req: Request, res: Response, // eslint-disable-next-line no-unused-vars - next: NextFunction + _next: NextFunction ) { logger.error(err) // Log error stack trace to the console res.status(500).send({ message: 'Something broke!' }) // Send error response diff --git a/server/src/middleware/session.ts b/server/src/middleware/session.ts index a6f90e3..34718e0 100644 --- a/server/src/middleware/session.ts +++ b/server/src/middleware/session.ts @@ -12,7 +12,7 @@ export default session({ domain: config.domain, httpOnly: true, secure: config.protocol === 'https:', - sameSite: 'strict', + sameSite: 'lax', maxAge: config.sessionMaxAge, }, store: MongoStore.create({