diff --git a/plugins/auth-backend/src/providers/config.ts b/plugins/auth-backend/src/providers/config.ts index b899347938..92d50ee208 100644 --- a/plugins/auth-backend/src/providers/config.ts +++ b/plugins/auth-backend/src/providers/config.ts @@ -8,13 +8,4 @@ export const providers = [ passReqToCallback: true, }, }, - // { - // provider: 'github', - // options: { - // clientID: process.env.GITHUB_CLIENT_ID!, - // clientSecret: process.env.GITHUB_CLIENT_SECRET!, - // callbackURL: 'http://localhost:7000/auth/github/handler/frame', - // passReqToCallback: true, - // }, - // }, ]; diff --git a/plugins/auth-backend/src/providers/google/provider.ts b/plugins/auth-backend/src/providers/google/provider.ts new file mode 100644 index 0000000000..ddbb42c98b --- /dev/null +++ b/plugins/auth-backend/src/providers/google/provider.ts @@ -0,0 +1,67 @@ +import passport from 'passport'; +import express from 'express'; +import Router from 'express-promise-router'; +import { Strategy as GoogleStrategy } from 'passport-google-oauth20'; +import { AuthProviderHandlers, AuthResponse } from './../types'; + +export const provider = { + makeStrategy(options: any): passport.Strategy { + return new GoogleStrategy(options, function ( + _req: any, + accessToken: any, + refreshToken: any, + profile: any, + cb: any, + ) { + cb(undefined, { profile, accessToken, refreshToken }); + }); + }, + makeRouter(handlers: AuthProviderHandlers): express.Router { + const router = Router(); + router.get('/start', handlers.start); + router.get('/handler/frame', handlers.handle); + router.get('/logout', handlers.logout); + if (handlers.refresh) { + router.get('/refreshToken', handlers.refresh); + } + return router; + }, +}; + +export const GoogleAuthProviderHandler: AuthProviderHandlers = { + start(req, res, next) { + return passport.authenticate('google', { + scope: ['profile', 'email'], + accessType: 'offline', + prompt: 'consent', + state: '8745634875963', + })(req, res, next); + }, + handle(req, res, next) { + return passport.authenticate('google', function (_, user) { + postMessageResponse(res, { + type: 'oauth-result', + payload: user, + }); + })(req, res, next); + }, + logout(_req, res, _next) { + return res.send('logout!'); + }, +}; + +const postMessageResponse = (res: express.Response, data: AuthResponse) => { + const jsonData = JSON.stringify(data); + const base64Data = Buffer.from(jsonData, 'utf8').toString('base64'); + + res.setHeader('X-Frame-Options', 'sameorigin'); + res.end(` + +
+ + + + `); +}; diff --git a/plugins/auth-backend/src/providers/google/router.ts b/plugins/auth-backend/src/providers/google/router.ts deleted file mode 100644 index 73f5ee6f9d..0000000000 --- a/plugins/auth-backend/src/providers/google/router.ts +++ /dev/null @@ -1,34 +0,0 @@ -import express from 'express'; -import Router from 'express-promise-router'; -import passport from 'passport'; - -export const router = Router(); -router.get('/start', (req, res, next) => { - passport.authenticate('google', { - scope: ['profile', 'email'], - accessType: 'offline', - prompt: 'consent', - state: '8745634875963', - })(req, res, next); -}); - -router.get('/handler/frame', passport.authenticate('google'), function ( - req, - res, -) { - console.log('DEBUG: req.session.passport.user', req.session?.passport.user); - console.log('DEBUG: req.params =', req.params); - console.log('DEBUG: req.url =', req.url); - res.send('yay!'); -}); - -router.get('/logout', async (_req: express.Request, res: express.Response) => { - res.send('google provider logout'); -}); - -router.get( - '/refreshToken', - async (_req: express.Request, res: express.Response) => { - res.send('google provider refreshToken'); - }, -); diff --git a/plugins/auth-backend/src/providers/index.ts b/plugins/auth-backend/src/providers/index.ts new file mode 100644 index 0000000000..3cb2b6a018 --- /dev/null +++ b/plugins/auth-backend/src/providers/index.ts @@ -0,0 +1,17 @@ +import { AuthProvider } from './types'; +import { + provider as GoogleAuthProvider, + GoogleAuthProviderHandler, +} from './google/provider'; + +const providerFactories: AuthProvider = { + google: GoogleAuthProvider, +}; + +export const makeProvider = (config: any) => { + const provider = config.provider; + const providerFactory = providerFactories[provider]; + const strategy = providerFactory.makeStrategy(config.options); + const providerRouter = providerFactory.makeRouter(GoogleAuthProviderHandler); + return { provider, strategy, providerRouter }; +}; diff --git a/plugins/auth-backend/src/providers/types.ts b/plugins/auth-backend/src/providers/types.ts new file mode 100644 index 0000000000..442ab405e2 --- /dev/null +++ b/plugins/auth-backend/src/providers/types.ts @@ -0,0 +1,44 @@ +import express from 'express'; +import passport from 'passport'; + +export type AuthProviderHandlers = { + start( + req: express.Request, + res: express.Response, + next: express.NextFunction, + ): Promise