diff --git a/packages/lit-auth-client/src/lib/providers/BaseProvider.ts b/packages/lit-auth-client/src/lib/providers/BaseProvider.ts index 67f771426..b3f0cc001 100644 --- a/packages/lit-auth-client/src/lib/providers/BaseProvider.ts +++ b/packages/lit-auth-client/src/lib/providers/BaseProvider.ts @@ -47,10 +47,12 @@ export abstract class BaseProvider { * * @template T - Type representing the specific options for the authenticate method * @param {T} [options] - Optional parameters that vary based on the provider + * @param {(currentUrl: string, redirectUri: string) => boolean} [urlCheckCallback] - Optional callback to handle authentication data or errors * @returns {Promise} - Auth method object that contains authentication data */ abstract authenticate( - options?: T + options?: T, + urlCheckCallback?: (currentUrl: string, redirectUri: string) => boolean ): Promise; /** diff --git a/packages/lit-auth-client/src/lib/providers/GoogleProvider.ts b/packages/lit-auth-client/src/lib/providers/GoogleProvider.ts index e4791c97b..91372332e 100644 --- a/packages/lit-auth-client/src/lib/providers/GoogleProvider.ts +++ b/packages/lit-auth-client/src/lib/providers/GoogleProvider.ts @@ -1,5 +1,6 @@ import { AuthMethod, + AuthenticateOptions, BaseProviderOptions, OAuthProviderOptions, } from '@lit-protocol/types'; @@ -28,13 +29,19 @@ export default class GoogleProvider extends BaseProvider { /** * Redirect user to the Lit's Google login page * + * @param {Function} [callback] - Optional callback to handle login URL * @returns {Promise} - Redirects user to Lit login page */ - public async signIn(): Promise { + public async signIn(callback?: (url: string) => void): Promise { // Get login url const loginUrl = await prepareLoginUrl('google', this.redirectUri); - // Redirect to login url - window.location.assign(loginUrl); + + // If callback is provided, use it. Otherwise, redirect to login url + if (callback) { + callback(loginUrl); + } else { + window.location.assign(loginUrl); + } } /** @@ -42,9 +49,17 @@ export default class GoogleProvider extends BaseProvider { * * @returns {Promise} - Auth method object that contains OAuth token */ - public async authenticate(): Promise { - // Check if current url matches redirect uri - if (!window.location.href.startsWith(this.redirectUri)) { + public async authenticate( + _?: T, + urlCheckCallback?: (currentUrl: string, redirectUri: string) => boolean + ): Promise { + + // Check if current url matches redirect uri using the callback if provided + const isUrlValid = urlCheckCallback + ? urlCheckCallback(window.location.href, this.redirectUri) + : window.location.href.startsWith(this.redirectUri); + + if (!isUrlValid) { throw new Error( `Current url "${window.location.href}" does not match provided redirect uri "${this.redirectUri}"` );