From 16c4e7b63c57963c99eca4f6c8b11c8bed7cde3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rodrigo=20L=C3=B3pez=20Dato?= Date: Thu, 14 Aug 2025 17:14:51 -0300 Subject: [PATCH 1/2] Add exp to generated JWTs --- .../thirdParty/metabase/JWTProvider/JWTProvider.tsx | 4 ++-- src/components/thirdParty/metabase/JWTProvider/types.ts | 2 +- src/components/thirdParty/metabase/hooks/types.ts | 2 +- src/components/thirdParty/metabase/hooks/useJWTLogin.ts | 7 ++++--- src/components/thirdParty/metabase/utils/constants.ts | 2 +- src/pages/_app.tsx | 2 +- src/pages/api/auth/metabase.ts | 9 +++++---- src/pages/embedding/full-app/setup.tsx | 7 ++++--- 8 files changed, 19 insertions(+), 16 deletions(-) diff --git a/src/components/thirdParty/metabase/JWTProvider/JWTProvider.tsx b/src/components/thirdParty/metabase/JWTProvider/JWTProvider.tsx index 26139bb..82feab4 100644 --- a/src/components/thirdParty/metabase/JWTProvider/JWTProvider.tsx +++ b/src/components/thirdParty/metabase/JWTProvider/JWTProvider.tsx @@ -6,13 +6,13 @@ import { IJWTProviderProps } from "./types"; export default function JWTProvider({ appId, user, - expiresIn, + expiresInSeconds, children, }: PropsWithChildren): ReactElement { const { jwt, loading, error } = useJWTLogin({ appId, user, - expiresIn, + expiresInSeconds, }); if (loading) { diff --git a/src/components/thirdParty/metabase/JWTProvider/types.ts b/src/components/thirdParty/metabase/JWTProvider/types.ts index 28e71a3..02365e3 100644 --- a/src/components/thirdParty/metabase/JWTProvider/types.ts +++ b/src/components/thirdParty/metabase/JWTProvider/types.ts @@ -3,5 +3,5 @@ import { IUser } from "../types"; export interface IJWTProviderProps { appId?: string; user?: IUser; - expiresIn?: string; + expiresInSeconds?: number; } diff --git a/src/components/thirdParty/metabase/hooks/types.ts b/src/components/thirdParty/metabase/hooks/types.ts index 14f2eff..520380f 100644 --- a/src/components/thirdParty/metabase/hooks/types.ts +++ b/src/components/thirdParty/metabase/hooks/types.ts @@ -4,7 +4,7 @@ export interface IUseJWTLoginProps { appId?: string; user?: IUser; returnTo?: string; - expiresIn?: string; + expiresInSeconds?: number; } export interface IUseJWTLoginRes { diff --git a/src/components/thirdParty/metabase/hooks/useJWTLogin.ts b/src/components/thirdParty/metabase/hooks/useJWTLogin.ts index 24fd60a..19fa1e8 100644 --- a/src/components/thirdParty/metabase/hooks/useJWTLogin.ts +++ b/src/components/thirdParty/metabase/hooks/useJWTLogin.ts @@ -1,11 +1,12 @@ import { useCallback, useEffect, useState } from "react"; import { IUseJWTLoginProps, IUseJWTLoginRes } from "./types"; +import { DEFAULT_EXPIRATION_SECONDS } from "../utils/constants"; export function useJWTLogin({ appId = process.env.METABASE_APP_ID, user, returnTo = "/", - expiresIn, + expiresInSeconds = DEFAULT_EXPIRATION_SECONDS, }: IUseJWTLoginProps = {}): IUseJWTLoginRes { const [requestDate, setRequestDate] = useState(); const [jwt, setJWT] = useState(); @@ -24,7 +25,7 @@ export function useJWTLogin({ appId, user, returnTo, - expiresIn, // Not used: see FIX + exp: Math.floor(Date.now() / 1000) + expiresInSeconds, // Not used: see FIX }), }); const data = await response.json(); @@ -37,7 +38,7 @@ export function useJWTLogin({ setError(err.message || err); console.error(err); } - }, [appId, user, returnTo, expiresIn]); + }, [appId, user, returnTo, expiresInSeconds]); useEffect(() => { getUrlAsync(); diff --git a/src/components/thirdParty/metabase/utils/constants.ts b/src/components/thirdParty/metabase/utils/constants.ts index 4c2d448..a6e4db8 100644 --- a/src/components/thirdParty/metabase/utils/constants.ts +++ b/src/components/thirdParty/metabase/utils/constants.ts @@ -8,4 +8,4 @@ export const DUMMY_USER: IUser = { groups: ["Read Only"], }; -export const DEFAULT_EXPIRATION = "2 days"; +export const DEFAULT_EXPIRATION_SECONDS = 5 * 60; // 5 minutes diff --git a/src/pages/_app.tsx b/src/pages/_app.tsx index 49f96c3..acf6452 100644 --- a/src/pages/_app.tsx +++ b/src/pages/_app.tsx @@ -35,7 +35,7 @@ export default function App({ Edumation - +