From eea76ebc284788efd4dcdf1ba85a745a3a172992 Mon Sep 17 00:00:00 2001 From: dswbx Date: Mon, 25 Nov 2024 19:59:46 +0100 Subject: [PATCH] confirmed SSR support with Remix --- app/src/Api.ts | 66 ++++++++++++++++----- app/src/auth/api/AuthController.ts | 11 +++- app/src/modules/ModuleApi.ts | 14 +++-- app/src/modules/server/AdminController.tsx | 13 ++-- app/src/ui/client/BkndProvider.tsx | 17 +++++- app/src/ui/client/ClientProvider.tsx | 18 ++++-- app/src/ui/client/utils/AppQueryClient.ts | 8 ++- app/src/ui/layouts/AppShell/Header.tsx | 4 +- app/src/ui/lib/routes.ts | 9 ++- bun.lockb | Bin 756112 -> 756816 bytes examples/remix/app/root.tsx | 21 +++++-- examples/remix/app/routes/_index.tsx | 3 +- examples/remix/app/routes/admin.$.tsx | 1 + examples/remix/package.json | 3 +- examples/remix/test.db | Bin 16384 -> 40960 bytes 15 files changed, 144 insertions(+), 44 deletions(-) diff --git a/app/src/Api.ts b/app/src/Api.ts index 0595557..f54ccdf 100644 --- a/app/src/Api.ts +++ b/app/src/Api.ts @@ -1,6 +1,7 @@ import { AuthApi } from "auth/api/AuthApi"; import { DataApi } from "data/api/DataApi"; import { decode } from "hono/jwt"; +import { omit } from "lodash-es"; import { MediaApi } from "media/api/MediaApi"; import { SystemApi } from "modules/SystemApi"; @@ -14,15 +15,18 @@ declare global { export type ApiOptions = { host: string; + user?: object; token?: string; - storage?: "localStorage" | "manual"; + headers?: Headers; key?: string; + localStorage?: boolean; }; export class Api { private token?: string; private user?: object; private verified = false; + private token_transport: "header" | "cookie" | "none" = "header"; public system!: SystemApi; public data!: DataApi; @@ -30,7 +34,12 @@ export class Api { public media!: MediaApi; constructor(private readonly options: ApiOptions) { - if (options.token) { + if (options.user) { + this.user = options.user; + this.token_transport = "none"; + this.verified = true; + } else if (options.token) { + this.token_transport = "header"; this.updateToken(options.token); } else { this.extractToken(); @@ -39,33 +48,44 @@ export class Api { this.buildApis(); } - get tokenStorage() { - return this.options.storage ?? "manual"; - } get tokenKey() { return this.options.key ?? "auth"; } private extractToken() { - if (this.tokenStorage === "localStorage") { + if (this.options.headers) { + // try cookies + const cookieToken = getCookieValue(this.options.headers.get("cookie"), "auth"); + if (cookieToken) { + this.updateToken(cookieToken); + this.token_transport = "cookie"; + this.verified = true; + return; + } + + // try authorization header + const headerToken = this.options.headers.get("authorization")?.replace("Bearer ", ""); + if (headerToken) { + this.token_transport = "header"; + this.updateToken(headerToken); + return; + } + } else if (this.options.localStorage) { const token = localStorage.getItem(this.tokenKey); if (token) { - this.token = token; - this.user = decode(token).payload as any; - } - } else { - if (typeof window !== "undefined" && "__BKND__" in window) { - this.user = window.__BKND__.user; - this.verified = true; + this.token_transport = "header"; + this.updateToken(token); } } + + //console.warn("Couldn't extract token"); } updateToken(token?: string, rebuild?: boolean) { this.token = token; - this.user = token ? (decode(token).payload as any) : undefined; + this.user = token ? omit(decode(token).payload as any, ["iat", "iss", "exp"]) : undefined; - if (this.tokenStorage === "localStorage") { + if (this.options.localStorage) { const key = this.tokenKey; if (token) { @@ -94,7 +114,9 @@ export class Api { private buildApis() { const baseParams = { host: this.options.host, - token: this.token + token: this.token, + headers: this.options.headers, + token_transport: this.token_transport }; this.system = new SystemApi(baseParams); @@ -106,3 +128,15 @@ export class Api { this.media = new MediaApi(baseParams); } } + +function getCookieValue(cookies: string | null, name: string) { + if (!cookies) return null; + + for (const cookie of cookies.split("; ")) { + const [key, value] = cookie.split("="); + if (key === name && value) { + return decodeURIComponent(value); + } + } + return null; +} diff --git a/app/src/auth/api/AuthController.ts b/app/src/auth/api/AuthController.ts index ea07960..bd4ef63 100644 --- a/app/src/auth/api/AuthController.ts +++ b/app/src/auth/api/AuthController.ts @@ -35,7 +35,16 @@ export class AuthController implements ClassController { hono.get("/logout", async (c) => { await this.auth.authenticator.logout(c); - return c.json({ ok: true }); + if (this.auth.authenticator.isJsonRequest(c)) { + return c.json({ ok: true }); + } + + const referer = c.req.header("referer"); + if (referer) { + return c.redirect(referer); + } + + return c.redirect("/"); }); hono.get("/strategies", async (c) => { diff --git a/app/src/modules/ModuleApi.ts b/app/src/modules/ModuleApi.ts index 3454a8d..541505b 100644 --- a/app/src/modules/ModuleApi.ts +++ b/app/src/modules/ModuleApi.ts @@ -6,6 +6,8 @@ export type BaseModuleApiOptions = { host: string; basepath?: string; token?: string; + headers?: Headers; + token_transport?: "header" | "cookie" | "none"; }; export type ApiResponse = { @@ -53,14 +55,18 @@ export abstract class ModuleApi { } } - const headers = new Headers(_init?.headers ?? {}); + const headers = new Headers(this.options.headers ?? {}); + // add init headers + for (const [key, value] of Object.entries(_init?.headers ?? {})) { + headers.set(key, value as string); + } + headers.set("Accept", "application/json"); - if (this.options.token) { + // only add token if initial headers not provided + if (this.options.token && this.options.token_transport === "header") { //console.log("setting token", this.options.token); headers.set("Authorization", `Bearer ${this.options.token}`); - } else { - //console.log("no token"); } let body: any = _init?.body; diff --git a/app/src/modules/server/AdminController.tsx b/app/src/modules/server/AdminController.tsx index 8cb3670..1cffa11 100644 --- a/app/src/modules/server/AdminController.tsx +++ b/app/src/modules/server/AdminController.tsx @@ -38,20 +38,26 @@ export class AdminController implements ClassController { return this.app.modules.ctx(); } + private withBasePath(route: string = "") { + return (this.app.modules.configs().server.admin.basepath + route).replace(/\/+$/, "/"); + } + getController(): Hono { const auth = this.app.module.auth; const configs = this.app.modules.configs(); // if auth is not enabled, authenticator is undefined const auth_enabled = configs.auth.enabled; - const basepath = (String(configs.server.admin.basepath) + "/").replace(/\/+$/, "/"); const hono = new Hono<{ Variables: { html: string; }; - }>().basePath(basepath); + }>().basePath(this.withBasePath()); hono.use("*", async (c, next) => { - const obj = { user: auth.authenticator?.getUser() }; + const obj = { + user: auth.authenticator?.getUser(), + logout_route: this.withBasePath(authRoutes.logout) + }; const html = await this.getHtml(obj); if (!html) { console.warn("Couldn't generate HTML for admin UI"); @@ -85,7 +91,6 @@ export class AdminController implements ClassController { } hono.get("*", async (c) => { - console.log("admin", c.req.url); if (!this.ctx.guard.granted(SystemPermissions.accessAdmin)) { await addFlashMessage(c, "You are not authorized to access the Admin UI", "error"); return c.redirect(authRoutes.login); diff --git a/app/src/ui/client/BkndProvider.tsx b/app/src/ui/client/BkndProvider.tsx index 89ab0f0..14e704a 100644 --- a/app/src/ui/client/BkndProvider.tsx +++ b/app/src/ui/client/BkndProvider.tsx @@ -1,4 +1,4 @@ -import { notifications } from "@mantine/notifications"; +//import { notifications } from "@mantine/notifications"; import { getDefaultConfig, getDefaultSchema } from "modules/ModuleManager"; import { createContext, startTransition, useContext, useEffect, useRef, useState } from "react"; import type { ModuleConfigs, ModuleSchemas } from "../../modules"; @@ -83,7 +83,6 @@ export function BkndProvider({ if (!fetched || !schema) return null; const app = new AppReduced(schema?.config as any); - const actions = getSchemaActions({ client, setSchema, reloadSchema }); return ( @@ -93,6 +92,20 @@ export function BkndProvider({ ); } +type BkndWindowContext = { + user?: object; + logout_route: string; +}; +export function useBkndWindowContext(): BkndWindowContext { + if (typeof window !== "undefined" && window.__BKND__) { + return window.__BKND__ as any; + } else { + return { + logout_route: "/api/auth/logout" + }; + } +} + export function useBknd({ withSecrets }: { withSecrets?: boolean } = {}): BkndContext { const ctx = useContext(BkndContext); if (withSecrets) ctx.requireSecrets(); diff --git a/app/src/ui/client/ClientProvider.tsx b/app/src/ui/client/ClientProvider.tsx index cd31f42..4cca06b 100644 --- a/app/src/ui/client/ClientProvider.tsx +++ b/app/src/ui/client/ClientProvider.tsx @@ -1,5 +1,6 @@ import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; import { createContext, useContext, useEffect, useState } from "react"; +import { useBkndWindowContext } from "ui/client/BkndProvider"; import { AppQueryClient } from "./utils/AppQueryClient"; const ClientContext = createContext<{ baseUrl: string; client: AppQueryClient }>({ @@ -15,8 +16,13 @@ export const queryClient = new QueryClient({ } }); -export const ClientProvider = ({ children, baseUrl }: { children?: any; baseUrl?: string }) => { +export const ClientProvider = ({ + children, + baseUrl, + user +}: { children?: any; baseUrl?: string; user?: object }) => { const [actualBaseUrl, setActualBaseUrl] = useState(null); + const winCtx = useBkndWindowContext(); try { const _ctx_baseUrl = useBaseUrl(); @@ -40,8 +46,8 @@ export const ClientProvider = ({ children, baseUrl }: { children?: any; baseUrl? return null; // or a loader/spinner if desired } - console.log("client provider11 with", { baseUrl, fallback: actualBaseUrl }); - const client = createClient(actualBaseUrl); + //console.log("client provider11 with", { baseUrl, fallback: actualBaseUrl, user }); + const client = createClient(actualBaseUrl, user ?? winCtx.user); return ( @@ -52,11 +58,11 @@ export const ClientProvider = ({ children, baseUrl }: { children?: any; baseUrl? ); }; -export function createClient(baseUrl: string = window.location.origin) { - return new AppQueryClient(baseUrl); +export function createClient(baseUrl: string, user?: object) { + return new AppQueryClient(baseUrl, user); } -export function createOrUseClient(baseUrl: string = window.location.origin) { +export function createOrUseClient(baseUrl: string) { const context = useContext(ClientContext); if (!context) { console.warn("createOrUseClient returned a new client"); diff --git a/app/src/ui/client/utils/AppQueryClient.ts b/app/src/ui/client/utils/AppQueryClient.ts index 5f06704..8eecf9e 100644 --- a/app/src/ui/client/utils/AppQueryClient.ts +++ b/app/src/ui/client/utils/AppQueryClient.ts @@ -13,9 +13,13 @@ import { queryClient } from "../ClientProvider"; export class AppQueryClient { api: Api; - constructor(public baseUrl: string) { + constructor( + public baseUrl: string, + user?: object + ) { this.api = new Api({ - host: baseUrl + host: baseUrl, + user }); } diff --git a/app/src/ui/layouts/AppShell/Header.tsx b/app/src/ui/layouts/AppShell/Header.tsx index fd3f20c..4082391 100644 --- a/app/src/ui/layouts/AppShell/Header.tsx +++ b/app/src/ui/layouts/AppShell/Header.tsx @@ -14,6 +14,7 @@ import { } from "react-icons/tb"; import { Button } from "ui"; import { useAuth, useBknd } from "ui/client"; +import { useBkndWindowContext } from "ui/client/BkndProvider"; import { useBkndSystemTheme } from "ui/client/schema/system/use-bknd-system"; import { IconButton } from "ui/components/buttons/IconButton"; import { Logo } from "ui/components/display/Logo"; @@ -147,11 +148,12 @@ export function Header({ hasSidebar = true }) { function UserMenu() { const auth = useAuth(); const [navigate] = useNavigate(); + const { logout_route } = useBkndWindowContext(); async function handleLogout() { await auth.logout(); // @todo: grab from somewhere constant - window.location.href = "/auth/logout"; + navigate(logout_route, { reload: true }); } async function handleLogin() { diff --git a/app/src/ui/lib/routes.ts b/app/src/ui/lib/routes.ts index 2588403..1b3779c 100644 --- a/app/src/ui/lib/routes.ts +++ b/app/src/ui/lib/routes.ts @@ -63,8 +63,15 @@ export function useNavigate() { return [ ( url: string, - options?: { query?: object; absolute?: boolean; replace?: boolean; state?: any } + options?: + | { query?: object; absolute?: boolean; replace?: boolean; state?: any } + | { reload: true } ) => { + if (options && "reload" in options) { + window.location.href = url; + return; + } + const _url = options?.absolute ? `~/${basepath}${url}`.replace(/\/+/g, "/") : url; navigate(options?.query ? withQuery(_url, options?.query) : _url, { replace: options?.replace, diff --git a/bun.lockb b/bun.lockb index 565dd37a415a3dc3f08e7acaf2f196080e9c6cf1..ec74acc6c886997df7f45ea4900566c5de827cab 100755 GIT binary patch delta 69099 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�=~fGRJV|j?nNTP1N7FCBancF4lAK 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

TI~`b{wj<(c8xBfGWeSP_?*t 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

  • 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 Kb%uMUv;9BtYB;d~ diff --git a/examples/remix/app/root.tsx b/examples/remix/app/root.tsx index 39665ff..e65961c 100644 --- a/examples/remix/app/root.tsx +++ b/examples/remix/app/root.tsx @@ -1,5 +1,5 @@ import type { LoaderFunctionArgs } from "@remix-run/node"; -import { Links, Meta, Outlet, Scripts, ScrollRestoration } from "@remix-run/react"; +import { Links, Meta, Outlet, Scripts, ScrollRestoration, useLoaderData } from "@remix-run/react"; import { Api } from "bknd"; import { ClientProvider } from "bknd/ui"; @@ -22,15 +22,26 @@ export function Layout({ children }: { children: React.ReactNode }) { } export const loader = async (args: LoaderFunctionArgs) => { - args.context.api = new Api({ - host: new URL(args.request.url).origin + const api = new Api({ + host: new URL(args.request.url).origin, + headers: args.request.headers }); - return null; + + // add api to the context + args.context.api = api; + + return { + user: api.getAuthState().user + }; }; export default function App() { + const data = useLoaderData(); + + // add user to the client provider to indicate + // that you're authed using cookie return ( - + ); diff --git a/examples/remix/app/routes/_index.tsx b/examples/remix/app/routes/_index.tsx index 37c3c55..8bdc1f3 100644 --- a/examples/remix/app/routes/_index.tsx +++ b/examples/remix/app/routes/_index.tsx @@ -9,8 +9,9 @@ export const meta: MetaFunction = () => { export const loader = async (args: LoaderFunctionArgs) => { const api = args.context.api as Api; + const user = api.getAuthState().user; const { data } = await api.data.readMany("todos"); - return { data }; + return { data, user }; }; export default function Index() { diff --git a/examples/remix/app/routes/admin.$.tsx b/examples/remix/app/routes/admin.$.tsx index d73a208..811d13b 100644 --- a/examples/remix/app/routes/admin.$.tsx +++ b/examples/remix/app/routes/admin.$.tsx @@ -6,6 +6,7 @@ import "bknd/dist/styles.css"; export default function AdminPage() { const [loaded, setLoaded] = useState(false); useEffect(() => { + if (typeof window === "undefined") return; setLoaded(true); }, []); if (!loaded) return null; diff --git a/examples/remix/package.json b/examples/remix/package.json index f9c1602..5de343f 100644 --- a/examples/remix/package.json +++ b/examples/remix/package.json @@ -18,7 +18,8 @@ "bknd": "workspace:*", "isbot": "^4.1.0", "react": "^18.2.0", - "react-dom": "^18.2.0" + "react-dom": "^18.2.0", + "remix-utils": "^7.7.0" }, "devDependencies": { "@remix-run/dev": "^2.14.0", diff --git a/examples/remix/test.db b/examples/remix/test.db index 1125cc29798df725cb41193d81107b7ed0b3a93f..34f6d06f2452de763ae99a77753dac5ca5a99b7a 100644 GIT binary patch literal 40960 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