From 8787675c1990f74cc8ccf3f1e5332cc644148618 Mon Sep 17 00:00:00 2001 From: utkrishtS Date: Tue, 21 Jul 2026 11:41:43 +0530 Subject: [PATCH] fix(provider): fall back to returnTo for Auth Tab logout scheme --- .../provider/CustomTabsController.java | 3 +++ .../provider/CustomTabsControllerTest.java | 27 +++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/auth0/src/main/java/com/auth0/android/provider/CustomTabsController.java b/auth0/src/main/java/com/auth0/android/provider/CustomTabsController.java index 86dd047c4..f8c484692 100644 --- a/auth0/src/main/java/com/auth0/android/provider/CustomTabsController.java +++ b/auth0/src/main/java/com/auth0/android/provider/CustomTabsController.java @@ -174,6 +174,9 @@ private void launchAsAuthTab(@NonNull Context context, @NonNull Uri uri, @NonNul return; } String redirectUri = uri.getQueryParameter("redirect_uri"); + if (redirectUri == null) { + redirectUri = uri.getQueryParameter("returnTo"); + } if (redirectUri == null) { Log.e(TAG, "Could not determine redirect URI from authorize URL. This is likely a configuration error."); if (failureCallback != null) { diff --git a/auth0/src/test/java/com/auth0/android/provider/CustomTabsControllerTest.java b/auth0/src/test/java/com/auth0/android/provider/CustomTabsControllerTest.java index 172f41c63..860bcb3c5 100644 --- a/auth0/src/test/java/com/auth0/android/provider/CustomTabsControllerTest.java +++ b/auth0/src/test/java/com/auth0/android/provider/CustomTabsControllerTest.java @@ -385,6 +385,33 @@ public void shouldLaunchAsAuthTabWhenSupportedByBrowser() throws Exception { verify(context, never()).startActivity(any(Intent.class)); } + @Test + public void shouldLaunchAsAuthTabUsingReturnToWhenRedirectUriIsAbsent() throws Exception { + customTabsClientMock = Mockito.mockStatic(CustomTabsClient.class); + customTabsClientMock.when(() -> + CustomTabsClient.isAuthTabSupported(any(), eq(DEFAULT_BROWSER_PACKAGE)) + ).thenReturn(true); + + @SuppressWarnings("unchecked") + ActivityResultLauncher mockAuthTabLauncher = mock(ActivityResultLauncher.class); + + BrowserPicker browserPicker = mock(BrowserPicker.class); + when(browserPicker.getBestBrowserPackage(context.getPackageManager())).thenReturn(DEFAULT_BROWSER_PACKAGE); + CustomTabsOptions ctOptions = CustomTabsOptions.newBuilder() + .withBrowserPicker(browserPicker) + .withAuthTab() + .build(); + + CustomTabsController authTabController = + new CustomTabsController(context, ctOptions, twaLauncher, mockAuthTabLauncher); + + Uri logoutUri = Uri.parse("https://example.auth0.com/v2/logout?returnTo=myapp%3A%2F%2Fcallback"); + authTabController.launchUri(logoutUri, false, mockThreadSwitcher, null); + + verify(mockAuthTabLauncher, timeout(MAX_TEST_WAIT_TIME_MS)).launch(any(Intent.class)); + verify(context, never()).startActivity(any(Intent.class)); + } + @Test public void shouldFallbackToCustomTabWhenAuthTabNotSupportedByBrowser() { customTabsClientMock = Mockito.mockStatic(CustomTabsClient.class);