From 6a330774b3c72bfecdb0c2b4e2f38797d7788d9f Mon Sep 17 00:00:00 2001 From: Gabriel Matte Date: Fri, 27 Sep 2024 23:02:53 -0400 Subject: [PATCH] fixes 500 error --- server/app.js | 7 +- .../auth/modules/passport-providers/oauth.js | 70 ++++++++++++------- 2 files changed, 52 insertions(+), 25 deletions(-) diff --git a/server/app.js b/server/app.js index e28e255..e1ab3a6 100644 --- a/server/app.js +++ b/server/app.js @@ -52,7 +52,12 @@ app.use('/api/image', imagesRouter); // Add Auths methods const session = require('express-session'); -app.use(session({secret: process.env['SESSION_Secret']})); +app.use(session({ + secret: process.env['SESSION_Secret'], + resave: false, + saveUninitialized: false, + cookie: { secure: process.env.NODE_ENV === 'production' } +})); authManager = new AuthManager(app) authManager.addModule('passport-js') diff --git a/server/auth/modules/passport-providers/oauth.js b/server/auth/modules/passport-providers/oauth.js index 423d864..19c7938 100644 --- a/server/auth/modules/passport-providers/oauth.js +++ b/server/auth/modules/passport-providers/oauth.js @@ -1,43 +1,65 @@ var OAuth2Strategy = require('passport-oauth2') -class PassportOAuth{ - - register(app,passport,name,provider){ +class PassportOAuth { + register(app, passport, name, provider) { passport.use(name, new OAuth2Strategy({ authorizationURL: provider.authorization_url, tokenURL: provider.token_url, clientID: provider.client_id, clientSecret: provider.client_secret, callbackURL: `http://localhost:4400/api/auth/gmatte/callback`, - }, - async function(accessToken, refreshToken, params, profile, done) { + passReqToCallback: true + }, + async function(req, accessToken, refreshToken, params, profile, done) { try { - const req = await fetch(provider.userinfo_url,{ - headers:{ - Authorization:`Bearer ${accessToken}` - } - }) + const userInfoResponse = await fetch(provider.userinfo_url, { + headers: { 'Authorization': `Bearer ${accessToken}` } + }); + const userInfo = await userInfoResponse.json(); - const data = await req.json() - profile = data - done(null,{accessToken,refreshToken,profile}); + const user = { + id: userInfo.sub, + email: userInfo.email, + name: userInfo.name, + accessToken: accessToken, + refreshToken: refreshToken, + expiresIn: params.expires_in + }; + + // Store the tokens in the session + req.session.oauth2Tokens = { + accessToken: accessToken, + refreshToken: refreshToken, + expiresIn: params.expires_in + }; + + return done(null, user); } catch (error) { + console.error(`Error in OAuth2 Strategy ${name} :`, error); return done(error); } - } - )); + })); - app.use(`/api/auth/${name}`, passport.authenticate(name,{scope: provider.scopes.join(' ') ?? 'openid profile email'})); - app.use(`/api/auth/${name}/callback`, - passport.authenticate(name, { - successRedirect: '/', - failureRedirect: '/login', - session:false - }), - function(accessToken, refreshToken, params, profile, cb) { - console.log(params); + app.get(`/api/auth/${name}`, (req, res, next) => { + passport.authenticate(name, { + scope: provider.scopes.join(' ') ?? 'openid profile email offline_access', + prompt: 'consent' + })(req, res, next); + }); + + app.get(`/api/auth/${name}/callback`, + (req, res, next) => { + passport.authenticate(name, { failureRedirect: '/login' })(req, res, next); + }, + (req, res) => { + if (req.user) { + res.json(req.user) + } else { + res.status(401).json({ error: 'Authentication failed' }); + } } ); } } + module.exports = PassportOAuth; \ No newline at end of file