diff --git a/backend/onyx/main.py b/backend/onyx/main.py index 812ac558b..f43639218 100644 --- a/backend/onyx/main.py +++ b/backend/onyx/main.py @@ -391,6 +391,11 @@ def get_application() -> FastAPI: prefix="/auth", ) + if ( + AUTH_TYPE == AuthType.CLOUD + or AUTH_TYPE == AuthType.BASIC + or AUTH_TYPE == AuthType.GOOGLE_OAUTH + ): # Add refresh token endpoint for OAuth as well include_auth_router_with_prefix( application, diff --git a/web/src/app/layout.tsx b/web/src/app/layout.tsx index dc4835522..b846190b3 100644 --- a/web/src/app/layout.tsx +++ b/web/src/app/layout.tsx @@ -20,7 +20,7 @@ import { import { fetchAssistantData } from "@/lib/chat/fetchAssistantdata"; import { AppProvider } from "@/components/context/AppProvider"; import { PHProvider } from "./providers"; -import { getCurrentUserSS } from "@/lib/userSS"; +import { getAuthTypeMetadataSS, getCurrentUserSS } from "@/lib/userSS"; import { Suspense } from "react"; import PostHogPageView from "./PostHogPageView"; import Script from "next/script"; @@ -70,11 +70,13 @@ export default async function RootLayout({ }: { children: React.ReactNode; }) { - const [combinedSettings, assistantsData, user] = await Promise.all([ - fetchSettingsSS(), - fetchAssistantData(), - getCurrentUserSS(), - ]); + const [combinedSettings, assistantsData, user, authTypeMetadata] = + await Promise.all([ + fetchSettingsSS(), + fetchAssistantData(), + getCurrentUserSS(), + getAuthTypeMetadataSS(), + ]); const productGating = combinedSettings?.settings.application_status ?? ApplicationStatus.ACTIVE; @@ -147,6 +149,7 @@ export default async function RootLayout({ return getPageContent( { return ( - + (undefined); export function UserProvider({ + authTypeMetadata, children, user, settings, }: { + authTypeMetadata: AuthTypeMetadata; children: React.ReactNode; user: User | null; settings: CombinedSettings; @@ -102,7 +105,7 @@ export function UserProvider({ }; // Use the custom token refresh hook - useTokenRefresh(upToDateUser, fetchUser); + useTokenRefresh(upToDateUser, authTypeMetadata, fetchUser); const updateUserTemperatureOverrideEnabled = async (enabled: boolean) => { try { diff --git a/web/src/hooks/useTokenRefresh.ts b/web/src/hooks/useTokenRefresh.ts index eadbc79f5..e5db82b98 100644 --- a/web/src/hooks/useTokenRefresh.ts +++ b/web/src/hooks/useTokenRefresh.ts @@ -1,6 +1,7 @@ import { useState, useEffect, useRef } from "react"; import { User } from "@/lib/types"; import { NO_AUTH_USER_ID } from "@/lib/extension/constants"; +import { AuthTypeMetadata } from "@/lib/userSS"; // Refresh token every 10 minutes (600000ms) // This is shorter than the session expiry time to ensure tokens stay valid @@ -9,6 +10,7 @@ const REFRESH_INTERVAL = 600000; // Custom hook for handling JWT token refresh for current user export function useTokenRefresh( user: User | null, + authTypeMetadata: AuthTypeMetadata, onRefreshFail: () => Promise ) { // Track last refresh time to avoid unnecessary calls @@ -18,7 +20,13 @@ export function useTokenRefresh( const isFirstLoad = useRef(true); useEffect(() => { - if (!user || user.id === NO_AUTH_USER_ID) return; + if ( + !user || + user.id === NO_AUTH_USER_ID || + authTypeMetadata.authType === "oidc" || + authTypeMetadata.authType === "saml" + ) + return; const refreshTokenPeriodically = async () => { try { diff --git a/web/src/lib/users/fetchUserData.ts b/web/src/lib/users/fetchUserData.ts new file mode 100644 index 000000000..e69de29bb