auto login for single provider

This commit is contained in:
Jan Prochazka
2024-08-08 09:16:50 +02:00
parent e537b43563
commit 47729d8cc3
2 changed files with 64 additions and 38 deletions

View File

@@ -54,6 +54,7 @@ class AuthProviderBase {
return { return {
amoid: this.amoid, amoid: this.amoid,
workflowType: 'anonymous', workflowType: 'anonymous',
name: 'Anonymous',
}; };
} }
@@ -130,6 +131,7 @@ class OAuthProvider extends AuthProviderBase {
return { return {
...super.toJson(), ...super.toJson(),
workflowType: 'redirect', workflowType: 'redirect',
name: 'OAuth 2.0',
}; };
} }
@@ -187,6 +189,7 @@ class ADProvider extends AuthProviderBase {
return { return {
...super.toJson(), ...super.toJson(),
workflowType: 'credentials', workflowType: 'credentials',
name: 'Active Directory',
}; };
} }
} }
@@ -214,6 +217,7 @@ class LoginsProvider extends AuthProviderBase {
return { return {
...super.toJson(), ...super.toJson(),
workflowType: 'credentials', workflowType: 'credentials',
name: 'Login & Password',
}; };
} }
} }
@@ -229,6 +233,7 @@ class DenyAllProvider extends AuthProviderBase {
return { return {
...super.toJson(), ...super.toJson(),
workflowType: 'credentials', workflowType: 'credentials',
name: 'Deny all',
}; };
} }
} }

View File

@@ -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() { async function loadAvailableAuthProviders() {
const resp = await apiCall('auth/get-providers'); const resp = await apiCall('auth/get-providers');
availableProviders = resp.providers; availableProviders = resp.providers;
values.update(x => ({ ...x, amoid: resp.default })); values.update(x => ({ ...x, amoid: resp.default }));
if (availableProviders.length == 1) {
processSingleProvider(availableProviders[0]);
}
} }
onMount(() => { onMount(() => {
@@ -63,6 +76,49 @@
$: if ($values.amoid != serversLoadedForAmoId) { $: if ($values.amoid != serversLoadedForAmoId) {
loadAvailableServers($values.amoid); 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`);
}
</script> </script>
<div class="root theme-light theme-type-light"> <div class="root theme-light theme-type-light">
@@ -74,7 +130,7 @@
<div class="box"> <div class="box">
<div class="heading">Log In</div> <div class="heading">Log In</div>
<FormProviderCore {values}> <FormProviderCore {values}>
{#if !isAdminPage} {#if !isAdminPage && availableProviders?.length >= 2}
<FormSelectField <FormSelectField
label="Authentization method" label="Authentization method"
name="amoid" name="amoid"
@@ -189,44 +245,9 @@
enableApi(); enableApi();
if (isAdminPage || workflowType == 'credentials' || workflowType == 'anonymous') { if (isAdminPage || workflowType == 'credentials' || workflowType == 'anonymous') {
const resp = await apiCall('auth/login', { await processCredentialsLogin($values.amoid, e.detail);
amoid: $values.amoid,
isAdminPage,
...e.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`);
} else if (workflowType == 'redirect') { } else if (workflowType == 'redirect') {
const state = `dbg-oauth:${strmid}:${$values.amoid}`; await processRedirectLogin($values.amoid);
sessionStorage.setItem('oauthState', state);
console.log('Redirecting to OAUTH provider');
const resp = await apiCall('auth/redirect', {
amoid: $values.amoid,
state,
redirectUri: location.origin + location.pathname,
});
const { uri } = resp;
if (uri) {
location.replace(uri);
}
} }
}} }}
/> />