diff --git a/packages/api/src/auth/authProvider.js b/packages/api/src/auth/authProvider.js index 131757ee6..1b01a1d95 100644 --- a/packages/api/src/auth/authProvider.js +++ b/packages/api/src/auth/authProvider.js @@ -54,6 +54,7 @@ class AuthProviderBase { return { amoid: this.amoid, workflowType: 'anonymous', + name: 'Anonymous', }; } @@ -130,6 +131,7 @@ class OAuthProvider extends AuthProviderBase { return { ...super.toJson(), workflowType: 'redirect', + name: 'OAuth 2.0', }; } @@ -187,6 +189,7 @@ class ADProvider extends AuthProviderBase { return { ...super.toJson(), workflowType: 'credentials', + name: 'Active Directory', }; } } @@ -214,6 +217,7 @@ class LoginsProvider extends AuthProviderBase { return { ...super.toJson(), workflowType: 'credentials', + name: 'Login & Password', }; } } @@ -229,6 +233,7 @@ class DenyAllProvider extends AuthProviderBase { return { ...super.toJson(), workflowType: 'credentials', + name: 'Deny all', }; } } diff --git a/packages/web/src/LoginPage.svelte b/packages/web/src/LoginPage.svelte index e4880d6c0..40fecf917 100644 --- a/packages/web/src/LoginPage.svelte +++ b/packages/web/src/LoginPage.svelte @@ -45,10 +45,23 @@ } } + async function processSingleProvider(provider) { + if (provider.workflowType == 'redirect') { + await processRedirectLogin(provider.amoid); + } + if (provider.workflowType == 'anonymous') { + processCredentialsLogin(provider.amoid, {}); + } + } + async function loadAvailableAuthProviders() { const resp = await apiCall('auth/get-providers'); availableProviders = resp.providers; values.update(x => ({ ...x, amoid: resp.default })); + + if (availableProviders.length == 1) { + processSingleProvider(availableProviders[0]); + } } onMount(() => { @@ -63,6 +76,49 @@ $: if ($values.amoid != serversLoadedForAmoId) { loadAvailableServers($values.amoid); } + + async function processRedirectLogin(amoid) { + const state = `dbg-oauth:${strmid}:${amoid}`; + + sessionStorage.setItem('oauthState', state); + console.log('Redirecting to OAUTH provider'); + + const resp = await apiCall('auth/redirect', { + amoid: amoid, + state, + redirectUri: location.origin + location.pathname, + }); + + const { uri } = resp; + if (uri) { + location.replace(uri); + } + } + + async function processCredentialsLogin(amoid, detail) { + const resp = await apiCall('auth/login', { + amoid, + isAdminPage, + ...detail, + }); + if (resp.error) { + internalRedirectTo( + `/?page=not-logged&error=${encodeURIComponent(resp.error)}&is-admin=${isAdminPage ? 'true' : ''}` + ); + return; + } + const { accessToken } = resp; + if (accessToken) { + localStorage.setItem(isAdminPage ? 'adminAccessToken' : 'accessToken', accessToken); + if (isAdminPage) { + internalRedirectTo('/?page=admin'); + } else { + internalRedirectTo('/'); + } + return; + } + internalRedirectTo(`/?page=not-logged`); + }
@@ -74,7 +130,7 @@
Log In
- {#if !isAdminPage} + {#if !isAdminPage && availableProviders?.length >= 2}