Desktop OIDC: full page nav to localhost, meta redirect back
Some checks failed
ci / build-test (push) Has been cancelled
ci / docker-build (push) Has been cancelled
Desktop App / Build Linux (amd64) (push) Has been cancelled
Desktop App / Attach to Release (push) Has been cancelled

SPA navigates to 127.0.0.1:18901/oidc/start, passing ret URL.
Go opens browser, waits for callback, saves token, returns HTML with
<meta refresh> back to Wails app with ?desktop=1&token=TOKEN.
main.ts extracts token from URL on reload.
This commit is contained in:
2026-07-14 00:13:01 +02:00
parent 8b3fe02a10
commit 2bd7de355b
5 changed files with 72 additions and 101 deletions

View File

@@ -72,43 +72,11 @@
try {
await startLogin()
} catch (e: any) {
const msg = e?.message || e || ''
if (msg.startsWith('DESKTOP_OIDC:')) {
const url = msg.substring('DESKTOP_OIDC:'.length)
await desktopOIDC(url)
return
}
error = msg || 'OIDC login failed'
error = e.message || 'OIDC login failed'
oidcLoggingIn = false
}
}
async function desktopOIDC(apiUrl: string) {
try {
const resp = await fetch(`http://127.0.0.1:18901/oidc/open?apiUrl=${encodeURIComponent(apiUrl)}`)
const { id } = await resp.json()
if (!id) throw new Error('No session ID')
for (let i = 0; i < 600; i++) {
await new Promise(r => setTimeout(r, 500))
const r = await fetch(`http://127.0.0.1:18901/oidc/result?id=${id}`)
const data = await r.json()
if (data.token) {
setConfig({ apiUrl, token: data.token, isDesktop: true })
initConfig({ apiUrl, token: data.token, isDesktop: true })
oidcLoggingIn = false
onConnected()
return
}
if (!data.pending || data.pending === 'false') break
}
error = 'Login timed out'
} catch (e: any) {
error = e?.message || 'Could not reach login service'
}
oidcLoggingIn = false
}
function logoutOIDC() {
oidcLogout()
oidcUser = null