From 8d424c8cb4d178d5fb92b6543d63fa409eb6430b Mon Sep 17 00:00:00 2001 From: bobzel Date: Wed, 4 Jun 2025 21:05:03 -0400 Subject: changed google authentication to not reload the page. --- src/server/ApiManagers/GeneralGoogleManager.ts | 27 +++++----------------- src/server/apis/google/GoogleApiServerUtils.ts | 16 +++++-------- .../apis/google/google_project_credentials.json | 8 +++---- 3 files changed, 16 insertions(+), 35 deletions(-) (limited to 'src/server') diff --git a/src/server/ApiManagers/GeneralGoogleManager.ts b/src/server/ApiManagers/GeneralGoogleManager.ts index 25589ccb5..59d066934 100644 --- a/src/server/ApiManagers/GeneralGoogleManager.ts +++ b/src/server/ApiManagers/GeneralGoogleManager.ts @@ -1,5 +1,5 @@ import ApiManager, { Registration } from './ApiManager'; -import { Method, _success } from '../RouteManager'; +import { Method } from '../RouteManager'; import { GoogleApiServerUtils } from '../apis/google/GoogleApiServerUtils'; import RouteSubscriber from '../RouteSubscriber'; import { Database } from '../database'; @@ -72,19 +72,19 @@ export default class GeneralGoogleManager extends ApiManager { secureHandler: async ({ req, res, user }) => { try { const auth = await GoogleApiServerUtils.retrieveOAuthClient(user); - + if (!auth) { return res.status(401).send('Google credentials missing or invalid.'); } - + const tasks = google.tasks({ version: 'v1', auth }); - + const { title, notes, due, status, completed } = req.body; const result = await tasks.tasks.insert({ tasklist: '@default', - requestBody: { title, notes, due, status, completed}, + requestBody: { title, notes, due, status, completed }, }); - + res.status(200).send(result.data); } catch (err) { console.error('Google Tasks error:', err); @@ -98,37 +98,22 @@ export default class GeneralGoogleManager extends ApiManager { subscription: '/refreshGoogle', secureHandler: async ({ user, req, res }) => { const code = req.query.code as string; - console.log('/refreshGoogle hit with code:', code); try { const enriched = await GoogleApiServerUtils.processNewUser(user.id, code); if (enriched.refresh_token) { - console.log('Enriched credentials:', enriched); - if (enriched.refresh_token) { user.googleToken = enriched.refresh_token; await user.save(); - console.log('Saved refresh token to user model'); } else { console.warn('No refresh token returned'); } } - - // await user.save(); - // _success(res, 'Google account successfully linked!'); - res.redirect('/home'); - } catch (err) { console.error('Failed to process Google code:', err); res.status(500).send('Error linking Google account'); } - - // const response2 = await Networking.PostToServer('/writeGoogleAccessToken', { authenticationCode }); - // runInAction(() => { - // this.success = true; - // this.credentials = response2 as { user_info: { name: string; picture: string }; access_token: string }; - // }); }, }); } diff --git a/src/server/apis/google/GoogleApiServerUtils.ts b/src/server/apis/google/GoogleApiServerUtils.ts index 56bc79119..2f7ef473c 100644 --- a/src/server/apis/google/GoogleApiServerUtils.ts +++ b/src/server/apis/google/GoogleApiServerUtils.ts @@ -185,18 +185,14 @@ export namespace GoogleApiServerUtils { */ export function generateAuthenticationUrl(): string { const oauth2Client = new google.auth.OAuth2( - '838617994486-a28072lirm8uk8cm78t7ic4krp0rgkgv.apps.googleusercontent.com', - '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', + '740987818053-dtflji3hfkn5r9t8ad6jb8740pls8moh.apps.googleusercontent.com', + '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', 'http://localhost:1050/refreshGoogle' // Ensure this matches the redirect URI in Google Cloud Console ); return oauth2Client.generateAuthUrl({ access_type: 'offline', - scope: [ - 'https://www.googleapis.com/auth/tasks', - 'openid', - 'profile' - ], + scope: ['https://www.googleapis.com/auth/tasks', 'openid', 'profile'], prompt: 'consent', // This ensures we get a refresh token }); } @@ -220,12 +216,12 @@ export namespace GoogleApiServerUtils { */ export async function processNewUser(userId: string, authenticationCode: string): Promise { const credentials = await new Promise((resolve, reject) => { - worker.getToken(authenticationCode, (err, credentials) => { - if (err || !credentials) { + worker.getToken(authenticationCode, (err, creds) => { + if (err || !creds) { reject(err); return; } - resolve(credentials); + resolve(creds); }); }); const enriched = injectUserInfo(credentials); diff --git a/src/server/apis/google/google_project_credentials.json b/src/server/apis/google/google_project_credentials.json index 010f9a626..8abc13b80 100644 --- a/src/server/apis/google/google_project_credentials.json +++ b/src/server/apis/google/google_project_credentials.json @@ -1,11 +1,11 @@ { "installed": { - "client_id": "838617994486-a28072lirm8uk8cm78t7ic4krp0rgkgv.apps.googleusercontent.com", - "project_id": "gtasks-test-dash", + "client_id": "740987818053-dtflji3hfkn5r9t8ad6jb8740pls8moh.apps.googleusercontent.com", + "project_id": "dash-web-461920", "auth_uri": "https://accounts.google.com/o/oauth2/auth", "token_uri": "https://oauth2.googleapis.com/token", "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", - "client_secret": "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", + "client_secret": "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", "redirect_uris": ["http://localhost:1050/refreshGoogle"] } -} \ No newline at end of file +} -- cgit v1.2.3-70-g09d2 From f7cb0dcebb0514cf38f8a7e635ec9959c196145a Mon Sep 17 00:00:00 2001 From: bobzel Date: Wed, 4 Jun 2025 21:32:34 -0400 Subject: cleaned up getting client id/secret for google. fixed final message after going through authentication process. --- src/server/ApiManagers/GeneralGoogleManager.ts | 39 +++++++++++++------------- src/server/apis/google/GoogleApiServerUtils.ts | 13 ++------- 2 files changed, 22 insertions(+), 30 deletions(-) (limited to 'src/server') diff --git a/src/server/ApiManagers/GeneralGoogleManager.ts b/src/server/ApiManagers/GeneralGoogleManager.ts index 59d066934..693b17779 100644 --- a/src/server/ApiManagers/GeneralGoogleManager.ts +++ b/src/server/ApiManagers/GeneralGoogleManager.ts @@ -96,25 +96,26 @@ export default class GeneralGoogleManager extends ApiManager { register({ method: Method.GET, subscription: '/refreshGoogle', - secureHandler: async ({ user, req, res }) => { - const code = req.query.code as string; - - try { - const enriched = await GoogleApiServerUtils.processNewUser(user.id, code); - - if (enriched.refresh_token) { - if (enriched.refresh_token) { - user.googleToken = enriched.refresh_token; - await user.save(); - } else { - console.warn('No refresh token returned'); - } - } - } catch (err) { - console.error('Failed to process Google code:', err); - res.status(500).send('Error linking Google account'); - } - }, + secureHandler: async ({ user, req, res }) => + new Promise(resolve => + GoogleApiServerUtils.processNewUser(user.id, req.query.code as string) + .then(enriched => { + if (enriched.refresh_token) { + if (enriched.refresh_token) { + user.googleToken = enriched.refresh_token; + user.save(); + } else { + console.warn('No refresh token returned'); + } + } + res.status(200).send('Google account linked successfully!'); + }) + .catch(err => { + console.error('Failed to process Google code:', err); + res.status(500).send('Error linking Google account'); + }) + .finally(resolve) + ), }); } } diff --git a/src/server/apis/google/GoogleApiServerUtils.ts b/src/server/apis/google/GoogleApiServerUtils.ts index 2f7ef473c..45c661730 100644 --- a/src/server/apis/google/GoogleApiServerUtils.ts +++ b/src/server/apis/google/GoogleApiServerUtils.ts @@ -14,6 +14,7 @@ import { DashUserModel } from '../../authentication/DashUserModel'; * This is the somewhat overkill list of what Dash requests * from the user. */ +// 'https://www.googleapis.com/auth/tasks', 'openid', 'profile' const scope = ['tasks', 'documents.readonly', 'documents', 'presentations', 'presentations.readonly', 'drive', 'drive.file', 'photoslibrary', 'photoslibrary.appendonly', 'photoslibrary.sharing', 'userinfo.profile'].map( relative => `https://www.googleapis.com/auth/${relative}` ); @@ -184,17 +185,7 @@ export namespace GoogleApiServerUtils { * @returns the newly generated url to the authentication landing page */ export function generateAuthenticationUrl(): string { - const oauth2Client = new google.auth.OAuth2( - '740987818053-dtflji3hfkn5r9t8ad6jb8740pls8moh.apps.googleusercontent.com', - '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', - 'http://localhost:1050/refreshGoogle' // Ensure this matches the redirect URI in Google Cloud Console - ); - - return oauth2Client.generateAuthUrl({ - access_type: 'offline', - scope: ['https://www.googleapis.com/auth/tasks', 'openid', 'profile'], - prompt: 'consent', // This ensures we get a refresh token - }); + return worker.generateAuthUrl({ scope, access_type: 'offline', prompt: 'consent' }); } /** -- cgit v1.2.3-70-g09d2 From 59689fe94c27986674dd6ecb7f0e6073861a98a6 Mon Sep 17 00:00:00 2001 From: bobzel Date: Wed, 4 Jun 2025 22:07:36 -0400 Subject: more cleanup of google authorization --- src/server/ApiManagers/GeneralGoogleManager.ts | 12 +----------- src/server/apis/google/GoogleApiServerUtils.ts | 7 +++---- src/server/authentication/DashUserModel.ts | 6 ------ 3 files changed, 4 insertions(+), 21 deletions(-) (limited to 'src/server') diff --git a/src/server/ApiManagers/GeneralGoogleManager.ts b/src/server/ApiManagers/GeneralGoogleManager.ts index 693b17779..7581eec13 100644 --- a/src/server/ApiManagers/GeneralGoogleManager.ts +++ b/src/server/ApiManagers/GeneralGoogleManager.ts @@ -99,17 +99,7 @@ export default class GeneralGoogleManager extends ApiManager { secureHandler: async ({ user, req, res }) => new Promise(resolve => GoogleApiServerUtils.processNewUser(user.id, req.query.code as string) - .then(enriched => { - if (enriched.refresh_token) { - if (enriched.refresh_token) { - user.googleToken = enriched.refresh_token; - user.save(); - } else { - console.warn('No refresh token returned'); - } - } - res.status(200).send('Google account linked successfully!'); - }) + .then(() => res.status(200).send('Google account linked successfully!')) .catch(err => { console.error('Failed to process Google code:', err); res.status(500).send('Error linking Google account'); diff --git a/src/server/apis/google/GoogleApiServerUtils.ts b/src/server/apis/google/GoogleApiServerUtils.ts index 45c661730..24905896d 100644 --- a/src/server/apis/google/GoogleApiServerUtils.ts +++ b/src/server/apis/google/GoogleApiServerUtils.ts @@ -14,7 +14,6 @@ import { DashUserModel } from '../../authentication/DashUserModel'; * This is the somewhat overkill list of what Dash requests * from the user. */ -// 'https://www.googleapis.com/auth/tasks', 'openid', 'profile' const scope = ['tasks', 'documents.readonly', 'documents', 'presentations', 'presentations.readonly', 'drive', 'drive.file', 'photoslibrary', 'photoslibrary.appendonly', 'photoslibrary.sharing', 'userinfo.profile'].map( relative => `https://www.googleapis.com/auth/${relative}` ); @@ -122,8 +121,7 @@ export namespace GoogleApiServerUtils { * @returns the relevant 'googleapis' wrapper, if any */ export async function GetEndpoint(sector: string, user: DashUserModel): Promise { - if (!user.googleToken) await retrieveOAuthClient(user); - const auth = user.googleToken; // await retrieveOAuthClient(user); + const auth = await retrieveOAuthClient(user); if (!auth) { return; } @@ -299,7 +297,7 @@ export namespace GoogleApiServerUtils { const headerParameters = { headers: { 'Content-Type': 'application/x-www-form-urlencoded' } }; const { client_id, client_secret } = GoogleCredentialsLoader.ProjectCredentials; const params = new URLSearchParams({ - refresh_token: credentials.refresh_token!, // AARAV use user.googleToken + refresh_token: credentials.refresh_token!, client_id, client_secret, grant_type: 'refresh_token', @@ -308,6 +306,7 @@ export namespace GoogleApiServerUtils { const { access_token, expires_in } = await new Promise<{ access_token: string; expires_in: number }>(resolve => { request.post(url, headerParameters).then(response => resolve(JSON.parse(response))); }); + // expires_in is in seconds, but we're building the new expiry date in milliseconds const expiry_date = new Date().getTime() + expires_in * 1000; await Database.Auxiliary.GoogleAccessToken.Update(user.id, access_token, expiry_date); diff --git a/src/server/authentication/DashUserModel.ts b/src/server/authentication/DashUserModel.ts index 4397e2bd4..debeef60c 100644 --- a/src/server/authentication/DashUserModel.ts +++ b/src/server/authentication/DashUserModel.ts @@ -9,14 +9,9 @@ export type DashUserModel = mongoose.Document & { passwordResetToken?: string; passwordResetExpires?: Date; - - // AARAV ADD - googleToken?: string; - dropboxRefresh?: string; dropboxToken?: string; - userDocumentId: string; sharingDocumentId: string; linkDatabaseId: string; @@ -45,7 +40,6 @@ const userSchema = new mongoose.Schema( passwordResetToken: String, passwordResetExpires: Date, - googleToken: String, dropboxRefresh: String, dropboxToken: String, userDocumentId: String, // id that identifies a document which hosts all of a user's account data -- cgit v1.2.3-70-g09d2