58 lines
1.6 KiB
TypeScript
58 lines
1.6 KiB
TypeScript
import { google } from 'googleapis';
|
|
import { env } from '$env/dynamic/private';
|
|
|
|
// Define OAuth scopes for the Google APIs we need to access
|
|
export const scopes = [
|
|
'https://www.googleapis.com/auth/gmail.send',
|
|
'https://www.googleapis.com/auth/userinfo.email',
|
|
'https://www.googleapis.com/auth/drive.readonly',
|
|
'https://www.googleapis.com/auth/spreadsheets.readonly'
|
|
];
|
|
|
|
/**
|
|
* Create a new OAuth2 client instance
|
|
* @returns Google OAuth2 client
|
|
*/
|
|
export function getOAuthClient() {
|
|
return new google.auth.OAuth2(
|
|
env.GOOGLE_CLIENT_ID,
|
|
env.GOOGLE_CLIENT_SECRET,
|
|
env.GOOGLE_REDIRECT_URI
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Create a authentication URL for OAuth flow
|
|
* @returns Auth URL for Google OAuth
|
|
*/
|
|
export function createAuthUrl() {
|
|
return getOAuthClient().generateAuthUrl({
|
|
access_type: 'offline',
|
|
prompt: 'consent',
|
|
scope: scopes,
|
|
redirect_uri: env.GOOGLE_REDIRECT_URI
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Exchange the authorization code for access and refresh tokens
|
|
* @param code - Authorization code from OAuth callback
|
|
* @returns Access and refresh tokens
|
|
*/
|
|
export async function exchangeCodeForTokens(code: string) {
|
|
const { tokens } = await getOAuthClient().getToken(code);
|
|
if (!tokens.refresh_token) throw new Error('No refresh_token returned');
|
|
return tokens;
|
|
}
|
|
|
|
/**
|
|
* Get an authenticated client using a refresh token
|
|
* @param refreshToken - Refresh token for authentication
|
|
* @returns Authenticated OAuth2 client
|
|
*/
|
|
export function getAuthenticatedClient(refreshToken: string) {
|
|
const oauth = getOAuthClient();
|
|
oauth.setCredentials({ refresh_token: refreshToken });
|
|
return oauth;
|
|
}
|