From 32e899e77e605541bc744f8ee29d94dccbc62d3f Mon Sep 17 00:00:00 2001 From: Stavros Date: Fri, 19 Jun 2026 13:32:46 +0300 Subject: [PATCH] feat: allow for prompt to skip authorize screen --- frontend/src/lib/hooks/screen-params.ts | 4 ++-- frontend/src/pages/authorize-page.tsx | 26 ++++++++++++++++++++----- frontend/src/pages/login-page.tsx | 4 ++-- internal/controller/oidc_controller.go | 19 +++++++++--------- internal/service/oidc_service.go | 26 +++++++++++++++++++++++++ 5 files changed, 60 insertions(+), 19 deletions(-) diff --git a/frontend/src/lib/hooks/screen-params.ts b/frontend/src/lib/hooks/screen-params.ts index 6a513d33..abf3a41a 100644 --- a/frontend/src/lib/hooks/screen-params.ts +++ b/frontend/src/lib/hooks/screen-params.ts @@ -6,7 +6,7 @@ type ScreenParams = { oidc_ticket?: string; oidc_scope?: string; oidc_name?: string; - oidc_login?: boolean; + oidc_prompt?: "none" | "login"; }; const zodScreenParams = z.object({ @@ -15,7 +15,7 @@ const zodScreenParams = z.object({ oidc_ticket: z.string().optional(), oidc_scope: z.string().optional(), oidc_name: z.string().optional(), - oidc_login: z.stringbool().optional(), + oidc_prompt: z.enum(["none", "login"]).optional(), }); export function useScreenParams(params: URLSearchParams): ScreenParams { diff --git a/frontend/src/pages/authorize-page.tsx b/frontend/src/pages/authorize-page.tsx index 20e9102f..0f14a583 100644 --- a/frontend/src/pages/authorize-page.tsx +++ b/frontend/src/pages/authorize-page.tsx @@ -25,6 +25,7 @@ import { recompileScreenParams, useScreenParams, } from "@/lib/hooks/screen-params"; +import { useEffect } from "react"; type Scope = { id: string; @@ -90,7 +91,15 @@ export const AuthorizePage = () => { const isOidc = screenParams.login_for === "oidc"; const compiledParams = recompileScreenParams(screenParams); - const authorizeMutation = useMutation({ + // TODO: maybe a better way to do this + const shouldAutoAuthorize = + auth.authenticated && + isOidc && + screenParams.oidc_ticket !== undefined && + screenParams.oidc_scope !== undefined && + screenParams.oidc_prompt === "none"; + + const { mutate: authorizeMutate, isPending: authorizePending } = useMutation({ mutationFn: () => { return axios.post("/api/oidc/authorize-complete", { ticket: screenParams.oidc_ticket, @@ -110,6 +119,12 @@ export const AuthorizePage = () => { }, }); + useEffect(() => { + if (shouldAutoAuthorize) { + authorizeMutate(); + } + }, [shouldAutoAuthorize, authorizeMutate]); + if (!isOidc || !screenParams.oidc_ticket || !screenParams.oidc_scope) { return ( { ); } - if (!auth.authenticated || screenParams.oidc_login) { + if (!auth.authenticated || screenParams.oidc_prompt === "login") { return ; } @@ -168,14 +183,15 @@ export const AuthorizePage = () => { )}