diff --git a/packages/browser/src/utils/hasAuthParamsInUrl.ts b/packages/browser/src/utils/hasAuthParamsInUrl.ts index 7d2e317b..69a6169c 100644 --- a/packages/browser/src/utils/hasAuthParamsInUrl.ts +++ b/packages/browser/src/utils/hasAuthParamsInUrl.ts @@ -17,10 +17,12 @@ */ /** - * Utility to check if `code` and `session_state` are available in the URL as search params. + * Utility to check if `code` is available in the URL as a search param. * - * @param params - The URL search params to check. Defaults to `window.location.search`. - * @return `true` if the URL contains `code` and `session_state` search params, otherwise `false`. + * @param params - The raw `URL.search` string to check (e.g. `"?code=abc&foo=bar"`). Must include + * the leading `?` or `&` delimiter — do **not** pass a `URLSearchParams.toString()` result, which + * omits the leading `?` and will never match. Defaults to `window.location.search`. + * @return `true` if the URL contains a `code` search param, otherwise `false`. */ const hasAuthParamsInUrl = (params: string = window.location.search): boolean => { const MATCHER = /[?&]code=[^&]+/; diff --git a/packages/react/src/hooks/useBrowserUrl.ts b/packages/react/src/hooks/useBrowserUrl.ts index 58495333..863bf5fa 100644 --- a/packages/react/src/hooks/useBrowserUrl.ts +++ b/packages/react/src/hooks/useBrowserUrl.ts @@ -51,6 +51,7 @@ export interface UseBrowserUrl { * const { hasAuthParams } = useBrowserUrl(); * const url = new URL(window.location.href); * + * // afterSignInUrl may be absolute ("https://example.com/after-signin") or relative ("/after-signin") * if (hasAuthParams(url, "/after-signin")) { * // Handle authentication callback * } @@ -58,7 +59,7 @@ export interface UseBrowserUrl { */ const useBrowserUrl = (): UseBrowserUrl => { const hasAuthParams = (url: URL, afterSignInUrl: string): boolean => - (hasAuthParamsInUrl() && new URL(url.origin + url.pathname).toString() === new URL(afterSignInUrl).toString()) || + (hasAuthParamsInUrl(url.search) && new URL(url.origin + url.pathname).toString() === new URL(afterSignInUrl, url.origin).toString()) || // authParams?.authorizationCode || // FIXME: These are sent externally. Need to see what we can do about this. url.searchParams.get('error') !== null; diff --git a/packages/vue/src/providers/ThunderIDProvider.ts b/packages/vue/src/providers/ThunderIDProvider.ts index 32f265a6..99ad18ac 100644 --- a/packages/vue/src/providers/ThunderIDProvider.ts +++ b/packages/vue/src/providers/ThunderIDProvider.ts @@ -77,7 +77,7 @@ interface ThunderIDProviderProps { */ function hasAuthParams(url: URL, afterSignInUrl: string | undefined): boolean { return ( - (hasAuthParamsInUrl() && + (hasAuthParamsInUrl(url.search) && !!afterSignInUrl && new URL(url.origin + url.pathname).toString() === new URL(afterSignInUrl).toString()) || url.searchParams.get('error') !== null