mirror of
https://github.com/danswer-ai/danswer.git
synced 2025-04-23 23:10:24 +02:00
parent
9951fe13ba
commit
e8370dcb24
@ -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,
|
||||
|
@ -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(
|
||||
<AppProvider
|
||||
authTypeMetadata={authTypeMetadata}
|
||||
user={user}
|
||||
settings={combinedSettings}
|
||||
assistants={assistants}
|
||||
|
@ -7,6 +7,7 @@ import { AssistantsProvider } from "./AssistantsContext";
|
||||
import { Persona } from "@/app/admin/assistants/interfaces";
|
||||
import { User } from "@/lib/types";
|
||||
import { ModalProvider } from "./ModalContext";
|
||||
import { AuthTypeMetadata } from "@/lib/userSS";
|
||||
|
||||
interface AppProviderProps {
|
||||
children: React.ReactNode;
|
||||
@ -15,6 +16,7 @@ interface AppProviderProps {
|
||||
assistants: Persona[];
|
||||
hasAnyConnectors: boolean;
|
||||
hasImageCompatibleModel: boolean;
|
||||
authTypeMetadata: AuthTypeMetadata;
|
||||
}
|
||||
|
||||
export const AppProvider = ({
|
||||
@ -24,10 +26,15 @@ export const AppProvider = ({
|
||||
assistants,
|
||||
hasAnyConnectors,
|
||||
hasImageCompatibleModel,
|
||||
authTypeMetadata,
|
||||
}: AppProviderProps) => {
|
||||
return (
|
||||
<SettingsProvider settings={settings}>
|
||||
<UserProvider settings={settings} user={user}>
|
||||
<UserProvider
|
||||
settings={settings}
|
||||
user={user}
|
||||
authTypeMetadata={authTypeMetadata}
|
||||
>
|
||||
<ProviderContextProvider>
|
||||
<AssistantsProvider
|
||||
initialAssistants={assistants}
|
||||
|
@ -13,6 +13,7 @@ import { usePostHog } from "posthog-js/react";
|
||||
import { CombinedSettings } from "@/app/admin/settings/interfaces";
|
||||
import { SettingsContext } from "../settings/SettingsProvider";
|
||||
import { useTokenRefresh } from "@/hooks/useTokenRefresh";
|
||||
import { AuthTypeMetadata } from "@/lib/userSS";
|
||||
|
||||
interface UserContextType {
|
||||
user: User | null;
|
||||
@ -33,10 +34,12 @@ interface UserContextType {
|
||||
const UserContext = createContext<UserContextType | undefined>(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 {
|
||||
|
@ -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<void>
|
||||
) {
|
||||
// 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 {
|
||||
|
0
web/src/lib/users/fetchUserData.ts
Normal file
0
web/src/lib/users/fetchUserData.ts
Normal file
Loading…
x
Reference in New Issue
Block a user